LINQ to Entities不支持“Ticks”

时间:2013-03-31 05:10:27

标签: c# linq entity-framework

这是我的代码:

 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'   实体。仅初始化程序,实体成员和实体导航   支持属性。

我该如何解决?

2 个答案:

答案 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代替CountAny生成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);