LINQ查询在转换为SQL之前在C#中进行求值?

时间:2012-12-03 02:46:34

标签: c# .net entity-framework

这有效

DateTime dtYesterday = DateTime.Now.AddDays(-1);
data = data.Where(d => d.CreatedTime <= dtYesterday);

但这不是

data = data.Where(d => d.CreatedTime <= DateTime.Now.AddDays(-1));

因为EF无法将其转换为SQL。没关系。

但出于好奇,有没有办法强制它在将DateTime.Now.AddDays(-1)转换为SQL之前评估data = data.Where(d => d.CreatedTime <= ForceEvaluate(DateTime.Now.AddDays(-1))); 的值?

我想知道是否有与此类似的语法?

{{1}}

1 个答案:

答案 0 :(得分:1)

IQueryable<T>IEnumerable<T>之间的区别在于前者保留了程序员(即您)编写的表达式,以将其呈现给执行查询的查询引擎(即RDBMS)。弄清楚DateTime.Now.AddDays(-1)是一个需要评估的函数会起作用,但与一个简单直接的解决方案相比,这是一个太熟悉的解决方案:

DateTime dtYesterday = DateTime.Now.AddDays(-1);
data = data.Where(d => d.CreatedTime <= dtYesterday);

不得不猜测会让程序员有机会将诸如DateTime.Now.AddDays(-1)之类的函数传递给RDBMS:完全可以想象当前的数据库日期/时间与应用程序服务器不同,可能导致不同的集合的行。另一方面,引入ForceEvaluate语法是没有意义的,因为如果你必须标记要评估的表达式,你也可以使用熟悉的方式(参见我上面粘贴的代码)。