C# ';滴答声';在LINQ to实体中不支持
这是我的代码:C# ';滴答声';在LINQ to实体中不支持,c#,linq,entity-framework,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);
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”
实体。仅初始值设定项、实体成员和实体导航
支持属性
如何解决此问题?当使用某些无法在数据库中使用的方法/属性时,LINQ to实体经常会出现这种情况 在这种情况下,可以将其值放入变量中 我注意到您也有语法错误,但您可以修复它。在修复
System.Data.Objects.EntityFunctions的语法错误后,应该可以使用以下代码。p、 日志详细时间。
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);
当使用一些不能在数据库中使用的方法/属性时,LINQ to实体经常会出现这种情况 在这种情况下,可以将其值放入变量中 我注意到您也有语法错误,但您可以修复它。在修复
System.Data.Objects.EntityFunctions的语法错误后,应该可以使用以下代码。p、 日志详细时间。
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);
如上所述,您不应该将所有记录提取到内存中,然后再进行筛选。您可以轻松比较日期值,而无需转换为刻度:
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
在存在的地方生成一个子句。这可能比SQL中的COUNT
更有效
您得到的是,现在只传输一个布尔值(位),而不是潜在的大量记录
注意:在Entity Framework 6中,Entity Functions
已替换为。如上所述,您不应将所有记录提取到内存中,然后进行筛选。您可以轻松比较日期值,而无需转换为刻度:
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
在存在的地方生成一个子句。这可能比SQL中的COUNT
更有效
您得到的是,现在只传输一个布尔值(位),而不是潜在的大量记录
注意:在实体框架6中,EntityFunctions
已被替换。为什么不直接使用p.LogDetailTime==LogDetailTime
?类型不匹配吗?为什么不直接使用p.LogDetailTime==LogDetailTime
?类型不匹配吗?我有溢出问题,我无法摆脱它。我必须检查年范围内的差异是否大于30秒。我知道,在SQL中,我可以先将日期转换为十进制,然后再进行比较,但我找不到一种使用EF的方法。现在,我必须分两部分进行查询:一部分过滤时间超过一个月,然后我进行另一个查询,包括剩余的侦察和秒过滤。我必须说这有点难看。我有溢出的问题,我无法摆脱它。我必须检查年范围内的差异是否大于30秒。我知道,在SQL中,我可以先将日期转换为十进制,然后再进行比较,但我找不到一种使用EF的方法。现在,我必须分两部分进行查询:一部分过滤时间超过一个月,然后我进行另一个查询,包括剩余的侦察和秒过滤。我得说这有点难看。