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。真的吗?