gpt4 book ai didi

c# - 为什么 Func<> 和 Expression> 可以互换?为什么一个对我有用?

转载 作者:太空狗 更新时间:2023-10-29 21:06:06 27 4
gpt4 key购买 nike

我有一个数据访问类,我花了一段时间才开始工作。对于我的应用程序,我需要获取不同类型的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com