Вычесть две даты с переменной «let», а затем усреднить ()?

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

Я сталкиваюсь со следующей ошибкой; 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();

person JReam    schedule 22.10.2015    source источник
comment
Каков твой вопрос?   -  person Enigmativity    schedule 22.10.2015


Ответы (1)


Помните, что Entity Framework переводит подмножество всех возможных инструкций LINQ в 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();
person Enigmativity    schedule 22.10.2015
comment
Спасибо, я следовал вашей логике, но немного раскрыл ее. - person JReam; 22.10.2015