【问题标题】:DbFunctions.TruncateTime() still producing "type member 'Date' is not supported" errorDbFunctions.TruncateTime() 仍然产生“不支持类型成员'日期'”错误
【发布时间】:2017-07-07 14:19:11
【问题描述】:

下面的 LINQ 查询确实有问题。我对这个错误做了很多研究,几乎我发现的所有内容都引用了 DbFunctions.TruncateTime() 的使用,但这似乎仍然对我不起作用。我希望有人可以看看这个,让我知道我哪里出错了。我要做的只是比较日期时间的日期部分,但我继续得到异常:LINQ to Entities 不支持指定的类型成员“日期”。仅支持初始化程序、实体成员和实体导航属性。

if (!db.MaintenanceWindows.Any(x => x.Id == Id & 
DbFunctions.TruncateTime(x.BlockedDay) == DateTime.UtcNow.Date & 
x.IsDeleted.Value == false))
{
...
}

TIA

【问题讨论】:

  • Date 属性在这里如何DateTime.UtcNow.Date
  • 我的意思是,它使用了Date 属性——正是异常消息告诉你的:)你为什么不把它放到查询之外的变量中。
  • 因为不能翻译成sql查询,所以不是支持的规范函数。对于您想要支持的每个电话,都必须有人编写代码以确保可以翻译。
  • 再次感谢您的快速响应。你们摇滚!
  • 好吧,考虑到 TruncateTimeDateTime.Date 属性的 db 等价物,我认为 EF 不支持它没有特殊原因。他们只是没有:)

标签: c# linq entity-framework-6


【解决方案1】:

这不是在抱怨DbFunctions.TruncateTime。它在抱怨DateTime.UtcNow.Date

建议一: (不推荐)

if (!db.MaintenanceWindows.Any(x => x.Id == Id && 
    DbFunctions.TruncateTime(x.BlockedDay) == DbFunctions.TruncateTime(DateTime.UtcNow) && 
    x.IsDeleted.Value == false))

建议 B:

var utcNow = DateTime.UtcNow.Date;
if (!db.MaintenanceWindows.Any(x => x.Id == Id && 
    DbFunctions.TruncateTime(x.BlockedDay) == utcNow && 
    x.IsDeleted.Value == false))

此外,您需要在表达式中使用“逻辑与”(&&)。

【讨论】:

  • 我不推荐建议 A。这样 SQL 服务器必须为每条记录从声明的变量中截断时间。进行快速 SQL 查询的最佳方法是将所有可能的参数设为静态。
  • 建议A最接近他的原始代码,B是优化后的版本。我应该说清楚的。
猜你喜欢
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 2022-10-18
相关资源
最近更新 更多