Вызов пользовательского метода в linq для сущностей без AsEnumerable - PullRequest
0 голосов
/ 31 августа 2018

В настоящее время у меня есть код Entity Framework, который выглядит следующим образом:

return _context
           .MyData
           .OrderBy(x => x.Name)
           .Select(x => new CustomObject { Name = x.Name, Description = x.Description });

Я хотел бы иметь возможность перенести создание моего CustomObject кода в отдельную функцию, поэтому что-то вроде этого:

 return _context
           .MyData
           .OrderBy(x => x.Name)
           .Select(x => CustomObjectFactory.Create(x));

Но когда я делаю это, я получаю

Linq для сущностей не распознает метод

ошибка. Я понимаю, что могу просто позвонить AsEnumerable():

return _context
          .MyData
          .OrderBy(x => x.Name)
          .AsEnumerable()
          .Select(x => CustomObjectFactory.Create(x));

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

Для получения бонусных баллов мне также было бы интересно узнать, как это сделать:

 return _context
            .MyData
            .OrderBy(x => x.Name)
            .CreateCustomObject()

1 Ответ

0 голосов
/ 31 августа 2018

Вы не можете сделать это, потому что до тех пор, пока вы не позвоните AsEnumerable, весь этот код будет переведен в запрос к базе данных. Код внутри этого выбора - это не обычный код, а expression, который переводится в операторы sql. База данных не знает ваших пользовательских методов - она ​​знает только некоторые из методов, определенных поставщиком вашей сущности, с некоторыми библиотеками можно вызывать функции, возвращающие примитивные типы.

После вызова AsEnumerable результаты запроса материализуются, поэтому вы можете использовать обычные методы c #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...