以下引发错误:
public FieldViewer GetFieldViewByFieldIDIPAndUserByDate( int fieldID, string ip, string userID, DateTime date )
{
return this.context.FieldViewers.Where( x =>
x.Field.FieldID == fieldID &&
x.Viewer.IPAddress == ip &&
x.Viewer.User.Id == userID &&
date.Subtract( x.Viewer.CreatedAt ).TotalMinutes >= 10 ).FirstOrDefault();
}
LINQ to Entities无法识别方法'System.TimeSpan Subtract(System.DateTime)'方法,并且此方法无法转换为商店表达式。
我如何解决这个问题,因为我需要减去每个查询。
答案 0 :(得分:2)
EntityFunctions.DiffMinutes
对你的情况来说效率低下。你应该这样做
public FieldViewer GetFieldViewByFieldIDIPAndUserByDate( int fieldID, string ip, string userID, DateTime date )
{
var tenMinThreshold = date - TimeSpan.FromMinutes(10);
return this.context.FieldViewers.Where( x =>
x.Field.FieldID == fieldID &&
x.Viewer.IPAddress == ip &&
x.Viewer.User.Id == userID &&
x.Viewer.CreatedAt <= tenMinThreshold).FirstOrDefault();
}
答案 1 :(得分:1)
解决此问题的一种方法是使用LINQ to Objects提供程序在LINQ to Entities提供程序之外执行该部分过滤。为此,请在该操作之前调用AsEnumerable()
:
public FieldViewer GetFieldViewByFieldIDIPAndUserByDate( int fieldID, string ip, string userID, DateTime date )
{
return this.context.FieldViewers.Where( x =>
x.Field.FieldID == fieldID &&
x.Viewer.IPAddress == ip &&
x.Viewer.User.Id == userID)
.AsEnumerable()
.Where(x => date.Subtract( x.Viewer.CreatedAt ).TotalMinutes >= 10)
.FirstOrDefault();
}
另一种方法是使用其中一个specialized LINQ to Entities operations,例如DiffMinutes
。
答案 2 :(得分:1)
尝试这样可以在几分钟内找到差异:
EntityFunctions.DiffMinutes(date, x.Viewer.CreatedAt) >= 10
来源:
How to subtract EntityFunctions.TruncateTime from custom time
由于这个api现在已经过时了(感谢你指出这个@ Jimmyt1988),而是使用:DbFunctions.DiffMinutes