将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使用?或者我应该使用更原始的解决方案,我也将日期时间转换为时代并比较这些?

+1

你现在试过'var now = DateTime.UtcNow;'然后'... entity.EndDate.Value>;'? – Igor

+0

entity.EndDate.Value.ComparetTo(otherDate)lookup CompareTo – kblau

+0

谢谢伊戈尔,这没有把戏。我以为我尝试过,但我想我没有。我仍然想知道为什么一个变种被接受,而一个财产不是?有任何想法吗? – Cornelis

的问题是,因为它是IQueryable状态,这意味着它尚未执行,并制作成具体数据的过程可以使用代码示例操作是不是本地的操作。这允许通过其他操作(如另一个Where子句)来调整查询,如果需要的话。

一旦数据被实际查询,Linq创建SQL来完成该任务并发送到数据库,并且该SQL无法确定UTC.Now是什么。

一个客户的选择是使数据混凝土,通过将其击落,然后过滤出来,如:

Entities.AsNoTracking().ToList() 
         .Where(entity => !entity.EndDate.HasValue 
              || entity.EndDate.Value > DateTime.UtcNow); 

这将工作通过ToList availble的制作到运行时的数据。成本当然会降低客户端中的所有值。如果那是小的话,如果它是成千上万的记录,那就很好;不建议。


否则数据库的选择是创建一个存储过程,以降低所需的记录,或添加返回boolean为所需要的测试(S)计算列字段。