LINQ to Entities 无法识别方法“System.TimeSpan Subtract(System.DateTime)”方法

Posted

技术标签:

【中文标题】LINQ to Entities 无法识别方法“System.TimeSpan Subtract(System.DateTime)”方法【英文标题】:LINQ to Entities does not recognize the method 'System.TimeSpan Subtract(System.DateTime)' method 【发布时间】:2013-02-22 05:53:55 【问题描述】:

我尝试在当前日期选择 60 天 30 天 20 天不同的数据库中的记录。

请在下面查看此查询。

 var uploads = (
                from files in _fileuploadRepository.Table
                join product in _productRepository.Table on files.Event equals product.Id
                where
                    (
                product.EventDate != null &&
                    (product.EventDate.Subtract(DateTime.Now).Days <= 60 && product.EventDate.Subtract(DateTime.Now).Days >= 60) ||
                    (product.EventDate.Subtract(DateTime.Now).Days <= 30 && product.EventDate.Subtract(DateTime.Now).Days >= 30) ||
                    (product.EventDate.Subtract(DateTime.Now).Days <= 20 && product.EventDate.Subtract(DateTime.Now).Days >= 20))
                    &&
                files.IsSkiped == false
                select files;
            ).ToList();

但是这个查询发生了错误。

我一无所知。请帮忙。

【问题讨论】:

您是否在 lambda 语句之外进行计算。当它像您使用它一样位于 lambda 内部时,您正在尝试让 EntityFramework 在不打算这样做时进行计算。 所以 LINQ to SQL 不会“翻译”像 product.EventDate.Subtract(DateTime.Now) 这样的表达式。在 C# 中,另一种表示法是 product.EventDate - DateTime.Now,其中使用 an overload of the minus (-) operator。有谁知道 that 是否可以与 LINQ to SQL 一起使用?毕竟在 SQL 方言中,日期减法也是可以的。 @JeppeStigNielsen 对于 EF,您可以使用 EntityFunctions.DiffDays 【参考方案1】:

最简单的方法是在执行查询之前计算出边界:

// Only evaluate DateTime.Now once for consistency. You might want DateTime.Today instead.
DateTime now = DateTime.Now;
DateTime nowPlus60Days = now.AddDays(60);
DateTime nowPlus30Days = now.AddDays(30);
DateTime nowPlus20Days = now.AddDays(20);

var query = ...
            where product.EventDate <= nowPlus60Days
            ...

请注意,您当前的查询甚至没有真正意义,因为每个“或”子句都说明给定的计算小于或等于一个值大于或等于相同的值。如果您想要简单的“等于”,请使用它。如果不是,则不清楚您要做什么。

如果您尝试将值分为“小于 20”、“20-30”、“30-60”、“大于 60”,则需要使用某种形式的分组。

【讨论】:

【参考方案2】:

您可以使用EntityFunctions.DiffDays 方法

EntityFunctions.DiffDays(product.EventDate, DateTime.Now) //this will return the difference in days

更新

EntityFunctions 现已过时,因此您应该改用 DBFunctions。

System.Data.Entity.DbFunctions.DiffDays(product.EventDate, DateTime.Now)

【讨论】:

EntityFunctions 现已过时:改用 System.Data.Entity.DbFunctions。【参考方案3】:

要补充 Scartag 的答案,

MSDN documentation for DbFunctions.DiffDays 没有直接提及 DiffDays() 返回的值是否以及何时为负数,所以我想我会在此处提供该信息:

当参数 1 的日期大于参数 2 的日期(即相对于将来)时,结果将为负数。

例如,给定一个表Deliveries,其中包含一个非空字段ScheduledDeliveryDate,该表可以具有相对于当前日期的过去和未来的值,此查询将获取所有具有交货日期的记录/当前日期/时间(过去和未来)的 2 天内的时间:

DateTime now = DateTime.Now;
var results = from d in Deliveries
    where (DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) < 2
        && DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) > -2)
    select d;

【讨论】:

【参考方案4】:

这应该可行:

using System.Data.Entity.SqlServer;

where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60

【讨论】:

以上是关于LINQ to Entities 无法识别方法“System.TimeSpan Subtract(System.DateTime)”方法的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to Entities 无法识别方法 IsNullOrWhiteSpace

错误:LINQ to Entities 无法识别方法 DataLength

LINQ To Entities 无法识别方法 Last。真的吗?

LINQ To Entities 无法识别方法 Last。真的吗?

C# LINQ to Entities 无法识别方法“布尔”

我如何修复“LINQ to Entities无法识别方法”错误