4

这有效

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)));
4

1 回答 1

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语法是没有意义的,因为如果您必须标记要评估的表达式,您最好使用熟悉的方式(请参阅我在上面粘贴的代码)。

于 2012-12-03T02:54:42.267 回答