2015-10-22 5 views
0

Попытка вычесть две даты друг от друга, чтобы выяснить количество дней, затем выполнить .Average() в переменной 'let' avgConversion.Вычесть две даты с переменной 'let', а затем average()?

Обнаружена следующая ошибка; LINQ to Entities не распознает метод «System.TimeSpan Subtract (System.DateTime)», и этот метод не может быть переведен в выражение хранилища.

var averageConversion = 
(
    from r in db.Registrations 
    where 
     (bu == "All" || r.BusinessUnit.Equals(bu)) && 
     (region == "All" || r.Region.Equals(region)) && 
     (startDate == null || r.StartDate >= startDate) && 
     (endDate == null || r.EndDate <= endDate) && 
     !r.RegistrationStatus.Equals("Cancelled") && 
     !r.Status.Equals("Cancelled") 
    let avgConversion = r.StartDate.Value.Subtract(r.RegistrationDate.Value).Days 
    select avgConversion 
).Average(); 

Благодаря Enigma это то, что в итоге решило проблему.

var dates = (from r in db.Registrations 
           where 
             (bu == "All" || r.BusinessUnit.Equals(bu)) && 
             (region == "All" || r.Region.Equals(region)) && 
             (startDate == null || r.StartDate >= startDate) && 
             (endDate == null || r.EndDate <= endDate) && 
             !r.RegistrationStatus.Equals("Cancelled") && 
             !r.Status.Equals("Cancelled") 
           select new 
           { 
            r.RegistrationDate, 
            r.StartDate 
           }).ToList(); 

     var avgConversion = (from d in dates 
          let AvgConversion = d.StartDate.Value.Subtract(d.RegistrationDate.Value).Days 
          select AvgConversion).Average(); 
+1

Каков ваш вопрос? – Enigmativity

ответ

1

Помните, что Entity Framework транслирует подмножество всех возможных утверждений LINQ Into SQL. Если вы используете методы или функции, которые не могут быть переведены, вы получаете ошибку «метод не может быть переведен в выражение хранилища».

Вместо этого вы должны вытащить свои данные в память перед выполнением вычислений, чтобы вы могли выполнять полное выражение LINQ.

Как это:

var averageConversion = 
(
    from r in db.Registrations 
    where 
     (bu == "All" || r.BusinessUnit.Equals(bu)) && 
     (region == "All" || r.Region.Equals(region)) && 
     (startDate == null || r.StartDate >= startDate) && 
     (endDate == null || r.EndDate <= endDate) && 
     !r.RegistrationStatus.Equals("Cancelled") && 
     !r.Status.Equals("Cancelled") 
    select new 
    { 
     r.StartDate, 
     r.RegistrationDate 
    } 
) 
    .ToArray() 
    .Select(r => r.StartDate.Value.Subtract(r.RegistrationDate.Value).Days) 
    .Average(); 
+0

Спасибо, я последовал вашей логике, но сломал ее немного больше. – JReam

Смежные вопросы