1

这是我的代码:

 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 Entities 不支持指定的类型成员“Ticks”。仅支持初始化程序、实体成员和实体导航属性。

我该如何解决?

4

2 回答 2

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子句。这可能比COUNTSQL 更有效。

您获得的是现在只传输一个布尔值(位)而不是潜在的大量记录。


注意:在 Entity Framework 6EntityFunctions中已被DbFunctions.

于 2013-05-02T08:21:06.417 回答
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);
于 2013-03-31T07:42:16.327 回答