c# – 为什么Func <>和Expression>可互换?为什么一个人在我的情况下工作?

c# – 为什么Func <>和Expression>可互换?为什么一个人在我的情况下工作?,第1张

概述我有一个数据访问类,花了我一段时间才能开始工作.对于我的应用程序,我需要获得不同类型的SQL Server表,其中WHERE子句仅因列名而不同:某些列是read_time,其他列是ReadTime,其他列是LastModifiedTime.所以我想我会传入WHERE子句,所以我不需要为50个不同的表创建一个新方法.它看起来很简单,而且有效,但我不明白. 该方法具有表达式<>作为参数,工作原理: i 我有一个数据访问类,花了我一段时间才能开始工作.对于我的应用程序,我需要获得不同类型的sql Server表,其中WHERE子句仅因列名而不同:某些列是read_time,其他列是ReadTime,其他列是LastModifIEdTime.所以我想我会传入WHERE子句,所以我不需要为50个不同的表创建一个新方法.它看起来很简单,而且有效,但我不明白.

该方法具有表达式<>作为参数,工作原理:

internal List<T> GetobjectsGreaterThanReadTime<T>(Expression<Func<T,bool>> whereClause) where T : class{    table<T> table = this.Database.Gettable<T>();    IEnumerable<T> objects = table.Where(whereClause);    return objects.ToList();}

现在,我正在尝试这种方式(下面)一段时间,它只会挂在最后一行(ToList()).首先,为什么要编译?我的意思是,为什么Expression和Func可以互换使用作为参数?那么,为什么Expression工作,而Func版本只是挂起?

注意:上述方法与此方法之间的唯一区别是方法参数(Expression vs. Func).

internal List<T> GetobjectsGreaterThanReadTime<T>(Func<T,bool> whereClause) where T : class{    table<T> table = this.Database.Gettable<T>();    IEnumerable<T> objects = table.Where(whereClause);    return objects.ToList();}
解决方法 Expression版本调用 Queryable.Where,它生成一个表达式树(当由ToList枚举时)被转换为sql并在数据库服务器上执行.据推测,数据库服务器将利用基于过滤条件的索引,以避免读取整个表.

Func版本调用Enumerable.Where(当由ToList枚举时)加载整个表(您认为是挂起),然后针对内存中对象运行过滤条件.

总结

以上是内存溢出为你收集整理的c# – 为什么Func <>和Expression>可互换?为什么一个人在我的情况下工作?全部内容,希望文章能够帮你解决c# – 为什么Func <>和Expression>可互换?为什么一个人在我的情况下工作?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1260452.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存