Как вызвать мою функцию в запросах LINQ to Entities - PullRequest
1 голос
/ 31 января 2012

Проблема

Я использую linq для возврата списка анонимных объектов

from s in _subsidiaryService.Repository.Query()
   where  s.Title.ToLower().Contains(term) ||
   s.Description.ToLower().Contains(term) ||
   s.District.ToLower().Contains(term)
   select new
              {
                  label = s.Title
                  ,
                  desc = s.Description
                  ,
                  value = s.ID
                  ,
                  icon = Url.Content(Path.Combine(string.Format(Constants.RelativePathSubsidiary, s.ID), SmallIconFileName))  //Problem line!!
              }

В строке icon, где проблема

Linq to Entities непризнать Path.Combine или string.Format

Вопросы

У меня есть два вопроса:

  1. Как мне запустить и Path.Combine string.format внутри моих запросов
  2. Как создать функции, которые выполняются внутри моих запросов?Например:

Пример кода

from s in _subsidiaryService.Repository.Query()
   where  s.Title.ToLower().Contains(term) ||
   s.Description.ToLower().Contains(term) ||
   s.District.ToLower().Contains(term)
   select new
              {
                  label = s.Title
                  ,
                  desc = s.Description
                  ,
                  value = s.ID
                  ,
                  icon = getIconPath(s.SmallIconFileName)
              }

Мой метод

public string getIconPath(Guid id, sring fileName) {
    return Url.Content(Path.Combine(string.Format(Constants.RelativePathSubsidiary, id), fileName));
}

1 Ответ

3 голосов
/ 31 января 2012

Измените его на:

(from s in _subsidiaryService.Repository.Query()
where  s.Title.ToLower().Contains(term) ||
s.Description.ToLower().Contains(term) ||
s.District.ToLower().Contains(term)
select s).AsEnumerable().Select(s => new { label = s.Title, desc = s.Description, value = s.ID, icon = getIconPath(s.SmallIconFileName) });

.AsEnumerable() переключает его с запроса на операции в памяти, поэтому он не пытается сопоставить функции с базой данных.

Стоит отметить, однако, что это означает, что он запускает все до .AsEnumerable в базе данных, локально вытягивает его до IEnumerable, затем начинает итерацию для создания анонимного объекта.Так что это влияет на производительность.Может быть целесообразно обрезать столбцы, которые вы выбираете, используя анонимный объект или убедившись, что вся ваша фильтрация Where выполнена до AsEnumerable.

...