2013-03-07 2 views
30

Я пытаюсь выбрать записи в базе данных за 60 дней 30 дней 20 дней в текущей дате.LINQ to Entities не распознает метод «System.TimeSpan Subtract (System.DateTime)»

См. Этот запрос ниже.

var uploads = (
       from files in _fileuploadRepository.Table 
       join product in _productRepository.Table on files.Event equals product.Id 
       where 
        (
       product.EventDate != null && 
        (product.EventDate.Subtract(DateTime.Now).Days <= 60 && product.EventDate.Subtract(DateTime.Now).Days >= 60) || 
        (product.EventDate.Subtract(DateTime.Now).Days <= 30 && product.EventDate.Subtract(DateTime.Now).Days >= 30) || 
        (product.EventDate.Subtract(DateTime.Now).Days <= 20 && product.EventDate.Subtract(DateTime.Now).Days >= 20)) 
        && 
       files.IsSkiped == false 
       select files; 
      ).ToList(); 

Однако возникла ошибка в этом запросе.

enter image description here

Я невежественный. Пожалуйста помоги.

+1

ли вам расчеты за пределами заявления лямбда. Когда он находится внутри лямбда, как вы его используете, вы пытаетесь сделать EntityFramework вычисления, когда он не предназначен для этого. – Middas

+0

Так что LINQ to SQL не будет «переводить» выражение типа 'product.EventDate.Subtract (DateTime.Now)'. В C# альтернативным обозначением является 'product.EventDate - DateTime.Now', где используется [перегрузка оператора минус (' -')] (http://msdn.microsoft.com/en-us/library/1905yhe2. ASPX). Кто-нибудь знает, будет ли _that_ работать с LINQ to SQL?В конце концов, вычитание дат также возможно в диалектах SQL. –

+0

@JeppeStigNielsen Для EF вы можете использовать EntityFunctions.DiffDays – scartag

ответ

33

Самый простой подход заключается в разработке границы перед тем вы выполняете запрос:

// Only evaluate DateTime.Now once for consistency. You might want DateTime.Today instead. 
DateTime now = DateTime.Now; 
DateTime nowPlus60Days = now.AddDays(60); 
DateTime nowPlus30Days = now.AddDays(30); 
DateTime nowPlus20Days = now.AddDays(20); 

var query = ... 
      where product.EventDate <= nowPlus60Days 
      ... 

Обратите внимание, что ваш текущий запрос, даже не имеет смысла, так как каждый «или» "d оговорка заявив, что данное вычисление меньше или равно значению и, большее или равное одному и тому же значению. Если вам нужно простое «равное», используйте его. Если нет, неясно, какие вы : пытается сделать.

Если вы пытаетесь ввести значения в значения «менее 20», «20-30», «30-60», «более 60», вам нужно будет использовать группировку определенной формы.

44

Вы можете использовать метод EntityFunctions.DiffDays

EntityFunctions.DiffDays(product.EventDate, DateTime.Now) //this will return the difference in days 

UPDATE

EntityFunctions является устаревшим, так что вы должны использовать вместо DBFunctions.

System.Data.Entity.DbFunctions.DiffDays(product.EventDate, DateTime.Now) 
+16

EntityFunctions теперь устарел: вместо этого используйте System.Data.Entity.DbFunctions. – celerno

2

Чтобы добавить к ответу scartag, в

MSDN documentation for DbFunctions.DiffDays непосредственно не говоря уже о том, когда значение, возвращаемое DiffDays() будет отрицательным, так что я бы предоставить эту информацию здесь:

Результат будет отрицательным, если дата аргумента 1 больше (т.е. в будущем относительно) аргумента 2 даты.

Например, для таблицы Deliveries с ненулевым полем ScheduledDeliveryDate, который может иметь значения как в прошлом, так и в будущем относительно текущей даты, этот запрос получит все записи с датой/временем поставки в течение 2 дней текущей даты/времени (как в прошлом, и в будущем):

DateTime now = DateTime.Now; 
var results = from d in Deliveries 
    where (DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) < 2 
     && DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) > -2) 
    select d; 
3

Это должно работать:

using System.Data.Entity.SqlServer; 

where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60 
Смежные вопросы