【问题标题】:'Ticks' is not supported in LINQ to EntitiesLINQ to Entities 不支持“刻度”
【发布时间】:2013-03-31 05:10:27
【问题描述】:

这是我的代码:

 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” 实体。只有初始化器、实体成员和实体导航 支持属性。

我该如何解决?

【问题讨论】:

  • 为什么不直接使用p.LogDetailTime == logDetailTime?类型不匹配吗?

标签: c# linq entity-framework


【解决方案1】:

如前所述,您不应该将所有记录提取到内存中然后进行过滤。您无需转换为刻度即可轻松比较日期值:

var query = this.Repository.ObjectContext.LogDetail
            .Where(p => p.LogId == logId 
                     && p.OperationId == operationId
                     && EntityFunctions.DiffSeconds(p.LogDetailTime,
                                                      logDetailTime) == 0);
return (query.Any());

请注意,当差值大于Int32.MaxValue 时,DiffSeconds 会导致溢出(错误:datediff 函数导致溢出)。我不知道您所追求的精度以及比较的值相距多远,因此您必须在这里做出选择。你真的对具有完全相同数量的刻度的记录感兴趣吗?很难想象。也许DiffMinutes 已经足够好了。

另一个可能的优化是使用Any 代替Count。 Any 生成一个 WHERE EXISTS 子句。这可能比 SQL 中的COUNT 更有效。

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


注意:在 Entity Framework 6 中,EntityFunctions 已替换为 DbFunctions。

【讨论】:

  • 我有溢出问题,我无法摆脱它。对于年份范围内的差异,我必须检查大于 30 秒的差异。我知道在 SQL 中我可以先将日期转换为 DECIMAL,然后进行比较,但我找不到使用 EF 的方法。现在我必须分两部分进行查询:一个过滤超过一个月,然后我执行另一个查询,其中包括剩余的 reconds 和几秒钟的过滤。我必须说这有点难看。
【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多