2015-07-22 1 views
2

Следующая выдает ошибку:LINQ к Entities не распознает метод «System.TimeSpan Subtract (System.DateTime)

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 does not recognize the method 'System.TimeSpan Subtract(System.DateTime)' method, and this method cannot be translated into a store expression.

Как идти о решении этого как мне нужно вычесть за запрос вместо этого.

+1

https://msdn.microsoft.com/en-us/library/dd395530(v=vs.110).aspx возможно? пример использования http://stackoverflow.com/questions/17486218/how-to-subtract-entityfunctions-truncatetime-from-custom-time – Ric

+1

Возможный дубликат [LINQ to Entities для вычитания 2 дат] (http://stackoverflow.com/questions/570858/linq-to-entities-for-subtracting-2-date) – Default

ответ

1

Один из способов исправить это - выполнить эту часть фильтрации вне поставщика LINQ to Entities, используя поставщик LINQ to Objects. Чтобы сделать это, добавьте вызов 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.

1

Попробуйте найти разницу в минутах:

EntityFunctions.DiffMinutes(date, x.Viewer.CreatedAt) >= 10

Источники:

How to subtract EntityFunctions.TruncateTime from custom time

EntityFunctions.DiffMinutes

Поскольку этот API является устаревшим (спасибо за указание на это @ Jimmyt1988), вместо этого используйте: DbFunctions.DiffMinutes

+0

'EntityFunctions устарел, вы можете использовать DbFunctions'. Спасибо за это, он отлично работает и делает это перед вызовом db! – Jimmyt1988

+0

Не знал этого, обновил ответ и спасибо. – Ric

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(); 
} 
Смежные вопросы