LINQ to Entities无法识别方法'System.TimeSpan Subtract(System.DateTime)

时间:2015-07-22 12:27:29

标签: c# linq entity-framework

以下引发错误:

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)'方法,并且此方法无法转换为商店表达式。

我如何解决这个问题,因为我需要减去每个查询。

3 个答案:

答案 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

EntityFunctions.DiffMinutes

由于这个api现在已经过时了(感谢你指出这个@ Jimmyt1988),而是使用:DbFunctions.DiffMinutes