【问题标题】:DATEDIFF (in months) in linqLINQ 中的 DATEDIFF(以月为单位)
【发布时间】: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


    【解决方案1】:

    您正在寻找SqlMethods.DateDiffMonth

    编辑:在 EF4 中,使用 SqlFunctions.DateDiff

    【讨论】:

    • 对不起,我使用的是实体框架而不是 linq to sql。我怎样才能使用 linq 呢?
    • 那你为什么要使用 LINQ to SQL 标签?
    • 实体函数/规范函数是 EF4 中另一个也许更好的选择:msdn.microsoft.com/en-us/library/…。我相信SqlFunctions 依赖于使用 SQL Server 作为数据提供者,Entity Functions 不是。如果我正确理解 MSDN 上的描述...
    • @SLanks:我在上面的查询中使用了这个函数,但它给出了:LINQ to Entities 不支持指定的类型成员“日期”。仅支持初始化器、实体成员和实体导航属性。
    • 目前在 EF6 中,使用 DbFunctions.&lt;various date methods&gt;
    【解决方案2】:

    暂时搁置您最初的问题,在您使用的查询中:

    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;
    

    【讨论】:

    • 这是一个更有帮助的答案。
    【解决方案3】:

    在 EF6 中,要使用的类是 DbFunctions。例如,请参阅DbFunctions.DiffMonths

    【讨论】:

      【解决方案4】:

      我用另一种方式解决了这个问题:我从代码中计算了日期:

      theDate = Date.Now.AddMonths(-4)
      

      在 EF 中改变条件:

      tblAccount.[State Change Date] < theDate
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-05
        • 2019-07-31
        • 2014-02-27
        • 2017-04-16
        • 2019-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多