исключение linq: эта функция может вызываться только из LINQ в сущности

Я пытаюсь получить данные, которые хранятся в кэше. Но он создает исключение в строке "выбрать новый FilterSsrsLog". Исключение: эта функция может вызываться только из LINQ в Entities

List<ExecutionLog3> reportServerDB = UpdateCache();
        var reportLog = (from r in reportServerDB
                         orderby r.TimeStart descending
                         where ((model.reportName == null ? true : r.ItemPath.Contains(model.reportName)) &&
                          (model.reportFolder == null ? true : r.ItemPath.Contains(model.reportFolder)) &&
                          (r.TimeStart >= startDateTime) &&
                          (r.TimeStart <= endDateTime)
                         )
                   select new FilterSsrsLog
                   {
                       UserName = r.UserName,
                       ReportName = r.ItemPath,
                       ReportFolder = r.ItemPath,
                       Format = r.Format,
                       Parameters = r.Parameters,
                       TimeStart = r.TimeStart,
                       TimeEnd = r.TimeEnd,
                       TotalTime = EntityFunctions.DiffMilliseconds(r.TimeStart, r.TimeEnd)
                   });

Если я удаляю блок кода " выбрать новый FilterSsrsLog "и пишу" выбрать r", он работает. Но мне нужно только то, что если что я могу сделать, чтобы решить эту проблему?

1 ответов


причина, по которой вы получаете эту ошибку, заключается в том, что запрос выполняется в памяти, а не в СУБД. The DiffMilliseconds функция-это маркер, который поставщик Entity Framework преобразует в SQL-СУБД для отправки в вашу СУБД. Функция не вычисляет свой результат при применении к IQueryable<T> в памяти, вместо того, чтобы бросать исключение.

если вы хотите запустить этот запрос в памяти, замените

TotalTime = EntityFunctions.DiffMilliseconds(r.TimeStart, r.TimeEnd)

С

TotalTime = (r.TimeEnd - r.TimeStart).TotalMilliseconds

вычитание двух дат дает TimeSpan значением, из которого вы можете взять его TotalMilliseconds собственность.