我有一个sql-server-ce 4数据库,其中有一个名为EndDate的my-input
列的表。当我删除记录时,我设置了此enddate,当我想要检索记录列表时,我想通过在enddate上应用过滤器来过滤所有已删除的记录。
我使用实体框架通过linq应用此过滤器。
我的linq查询如下所示:
DateTime?
当我执行此linq查询时,我收到以下错误:
功能' CurrentUtcDateTime' SQL Server Compact不支持。
搜索此错误告诉我(如果我已正确理解)我无法使用DateTime.UtcNow。
我的问题是:达到我试图达到的目标的另一种方法是什么?
我可以通过linq使用不同的功能吗?或者我应该使用更原始的解决方案,我还将日期时间转换为Epoch并进行比较?
答案 0 :(得分:0)
问题是代码示例 operation 不是操作的本地,因为它是IQueryable
状态,这意味着它还没有被执行并被制作成具体数据过程可以使用。这允许在需要时通过其他操作(例如另一个Where
子句)调整查询。
实际查询数据后,Linq创建SQL来完成该工作并发送到数据库,并且SQL无法确定UTC.Now
是什么。
一个客户端选项是使数据具体化,将其删除然后将其过滤掉,如:
Entities.AsNoTracking().ToList()
.Where(entity => !entity.EndDate.HasValue
|| entity.EndDate.Value > DateTime.UtcNow);
将通过ToList
工作,使数据可用于运行时。成本当然会降低客户端中要过滤的所有值。如果这个很小,那就好了,如果有数千条记录的话;不建议。
否则,数据库选项是创建存储过程以关闭所需的记录,或者添加一个计算列字段,该字段返回所需测试的布尔值。