将linq中的DateTime与sql server ce进行比较的最简单方法是什么?
问题描述:
我有一个名为EndDate的DateTime?
列的sql-server-ce 4数据库。当我删除一条记录时,我设置了这个结束日期,当我想要检索一个记录列表时,我想通过在enddate上应用一个过滤器来过滤所有删除的记录。将linq中的DateTime与sql server ce进行比较的最简单方法是什么?
我使用实体框架通过linq应用此过滤器。
我的LINQ查询看起来是这样的:
protected IDbSet<TEntity> Entities;
...
Entities.AsNoTracking().AsQueryable()
.Where(entity => !entity.EndDate.HasValue || entity.EndDate.Value > DateTime.UtcNow);
当我执行这个LINQ查询我得到以下错误:
The function 'CurrentUtcDateTime' is not supported by SQL Server Compact.
搜索这个错误告诉我,(如果我的理解是正确)我不能使用DateTime.UtcNow。
我的问题是:有什么方法可以达到我想要达到的目标?
有没有不同的功能,我可以通过linq使用?或者我应该使用更原始的解决方案,我也将日期时间转换为时代并比较这些?
答
的问题是,因为它是IQueryable
状态,这意味着它尚未执行,并制作成具体数据的过程可以使用代码示例操作是不是本地的操作。这允许通过其他操作(如另一个Where
子句)来调整查询,如果需要的话。
一旦数据被实际查询,Linq创建SQL来完成该任务并发送到数据库,并且该SQL无法确定UTC.Now
是什么。
一个客户的选择是使数据混凝土,通过将其击落,然后过滤出来,如:
Entities.AsNoTracking().ToList()
.Where(entity => !entity.EndDate.HasValue
|| entity.EndDate.Value > DateTime.UtcNow);
这将工作通过ToList
availble的制作到运行时的数据。成本当然会降低客户端中的所有值。如果那是小的话,如果它是成千上万的记录,那就很好;不建议。
否则数据库的选择是创建一个存储过程,以降低所需的记录,或添加返回boolean为所需要的测试(S)计算列字段。
你现在试过'var now = DateTime.UtcNow;'然后'... entity.EndDate.Value>;'? – Igor
entity.EndDate.Value.ComparetTo(otherDate)lookup CompareTo – kblau
谢谢伊戈尔,这没有把戏。我以为我尝试过,但我想我没有。我仍然想知道为什么一个变种被接受,而一个财产不是?有任何想法吗? – Cornelis