gpt4 book ai didi

c# - LINQ to SQL IQueryable 是否可以意外求值?

转载 作者:太空宇宙 更新时间:2023-11-03 20:36:17 29 4
gpt4 key购买 nike

我正在编写一些采用 LINQ to SQL 的代码 IQueryable<T>并添加进一步动态生成的 Where 子句。例如,这里是其中一种方法的框架:

IQueryable<T> ApplyContains(IQueryable<T> source, string field, string value)
{
Expression<Func<T, bool>> lambda;
... dynamically generate lambda for p => p.<field>.Contains(value) ...
return source.Where(lambda);
}

我可能会将这些方法中的几个链接在一起,并以一个 Skip/Take 页面结束。

IQueryable 时,我的想法是否正确?最终评估如果lambda表达式中有任何东西不能被翻译成SQL就会抛出异常?特别是我担心我可能会不小心做一些会导致 IQueryable 的事情。尽早评估,然后在内存中继续评估(从而提取数千条记录)。

根据我读过的一些内容,我怀疑 IQueryable不会这么早评价的。谁能证实这一点?

最佳答案

是的,如果表达式的一部分无法转换为 SQL,您认为 IQueryable 会在运行时抛出错误的想法是正确的。因此,我认为将您的查询放在业务层类(如数据服务或存储库)中,然后确保自动测试涵盖该查询是个好主意。

关于您的 Linq 表达式在意外时间求值,要牢记的基本规则是,只要您对其调用 foreach,您的表达式就会求值。这还包括在幕后调用 foreach 的方法,例如 ToList()FirstOrDefault() .

顺便说一句,判断方法是否将调用 foreach 并强制您的 lambda 求值的一种简单方法是检查该方法的返回值是否为 IQueryable。如果返回值是另一个 IQueryable,那么该方法可能只是添加到表达式中,而不是强制它求值。如果返回值为 List<T> 、匿名类型或任何看起来像数据而不是 IQueryable 的东西,那么该方法必须强制您的表达式求值以获取该数据。

关于c# - LINQ to SQL IQueryable 是否可以意外求值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4915127/

29 4 0