【发布时间】:2011-07-27 20:58:07
【问题描述】:
select col1,col2,col3 from table1
where(DATEDIFF(mm, tblAccount.[State Change Date], GETDATE()) <= 4
我想将此 sql 查询转换为 LINQ。但我不知道 LINQ 中有任何 DateDiff 替代方案。你能推荐我吗?
【问题讨论】:
标签: linq entity-framework linq-to-entities
select col1,col2,col3 from table1
where(DATEDIFF(mm, tblAccount.[State Change Date], GETDATE()) <= 4
我想将此 sql 查询转换为 LINQ。但我不知道 LINQ 中有任何 DateDiff 替代方案。你能推荐我吗?
【问题讨论】:
标签: linq entity-framework linq-to-entities
您正在寻找SqlMethods.DateDiffMonth。
编辑:在 EF4 中,使用 SqlFunctions.DateDiff。
【讨论】:
SqlFunctions 依赖于使用 SQL Server 作为数据提供者,Entity Functions 不是。如果我正确理解 MSDN 上的描述...
DbFunctions.<various date methods>。
暂时搁置您最初的问题,在您使用的查询中:
where(DATEDIFF(mm, tblAccount.[State Change Date], GETDATE()) <= 4
此查询总是会导致全表扫描,因为您将函数调用的结果与常量进行比较。如果您先计算日期,然后将列值与计算值进行比较,那会好得多,这将允许 SQL 使用索引来查找结果,而不必评估表中的每条记录。
看起来您正在尝试检索过去 4 个月内的任何内容,因此在您的应用程序代码中,尝试计算您可以首先比较的日期,并将该值传递给您的 Linq2Entities 表达式:
DateTime earliestDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-4);
var results = from t in context.table1
where t.col3 >= earliestDate
select t;
【讨论】:
在 EF6 中,要使用的类是 DbFunctions。例如,请参阅DbFunctions.DiffMonths。
【讨论】:
我用另一种方式解决了这个问题:我从代码中计算了日期:
theDate = Date.Now.AddMonths(-4)
在 EF 中改变条件:
tblAccount.[State Change Date] < theDate
【讨论】: