这有效
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}}
答案 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
语法是没有意义的,因为如果你必须标记要评估的表达式,你也可以使用熟悉的方式(参见我上面粘贴的代码)。