这是我的代码:
var count = this.Repository.ObjectContext.LogDetail
.Count(p => p.LogId == logId &&System.Data.Objects.EntityFunctions. p.LogDetailTime. == logDetailTime.Ticks && p.OperationId == operationId);
return (count > 0);
我收到此错误:
LINQ to不支持指定的类型成员'Ticks' 实体。仅初始化程序,实体成员和实体导航 支持属性。
我该如何解决?
答案 0 :(得分:6)
如上所述,您不应将所有记录提取到内存中,然后进行过滤。您可以轻松比较日期值而无需转换为刻度:
var query = this.Repository.ObjectContext.LogDetail
.Where(p => p.LogId == logId
&& p.OperationId == operationId
&& EntityFunctions.DiffSeconds(p.LogDetailTime,
logDetailTime) == 0);
return (query.Any());
请注意,当差异大于DiffSeconds
时,Int32.MaxValue
可能会导致溢出(错误: datediff函数导致溢出)。我不知道你之后的精确度以及相对值之间的差距,所以你必须在这里做出选择。你真的对具有完全相同数量的刻度的记录感兴趣吗?很难想象。也许DiffMinutes
足够好了。
另一种可能的优化方法是使用Any
代替Count
。 Any
生成WHERE EXISTS
子句。这可能比SQL中的COUNT
更有效。
你获得的是现在只传输一个布尔(位)而不是可能有大量的记录。
注意:在实体框架6 EntityFunctions
已替换为DbFunctions
。
答案 1 :(得分:2)
使用某些无法在数据库中使用的方法/属性时,LINQ to Entities会发生很多这种情况。
在这种情况下,您可以将其值放在变量中。
我注意到你也有语法错误,但你可以解决它。在修复System.Data.Objects.EntityFunctions. p.LogDetailTime.
var ticks = logDetailTime.Ticks;
var count = this.Repository.ObjectContext.LogDetail
.Count(p => p.LogId == logId &&System.Data.Objects.EntityFunctions. p.LogDetailTime. == ticks && p.OperationId == operationId);
return (count > 0);