- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个数据访问类,我花了一段时间才开始工作。对于我的应用程序,我需要获取不同类型的 SQL Server 表,其中 WHERE 子句仅列名不同:一些列是 read_time,其他是 ReadTime,还有一些是 LastModifiedTime。所以我想我应该传入 WHERE 子句,这样我就不需要为 50 个不同的表创建新方法。看起来很简单,也很管用,但我有点不明白。
此方法以 Expression<> 作为参数,有效:
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 与 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();
}
最佳答案
表达式版本调用Queryable.Where
它生成一个表达式树,它(当被 ToList
枚举时)被转换为 sql 并在数据库服务器上执行。据推测,数据库服务器将利用基于过滤条件的索引,以避免读取整个表。
Func 版本调用 Enumerable.Where
其中(当由 ToList
枚举时)加载整个表(您认为是挂起),然后针对内存中的对象运行过滤条件。
关于c# - 为什么 Func<> 和 Expression<Func<>> 可以互换?为什么一个对我有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10016782/
假设我有两个名为Student和Employee的结构(或类),并且Student和Employee具有完全相同的成员。 我的问题是,为什么我不能执行以下操作: Student s; Employee
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Hashset vs Treeset 你可以使用 HashSet和TreeSet可以互换吗?如果我交换TreeSet
页面上有一个值为“button1”的按钮。当按下时,它必须删除自身并添加值为“button2”的新按钮。当按下“button2”时,它必须删除自身并添加“button1”回来。有点无限循环。 我知道只
以下模板 template int compute(Data d, Number n) { if(n > 10) SLOW(d) if(n (data)模板。除了代码重复,comput
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!