Инструкции Linq для объектов для анализа результата функции, а не вызова функции - PullRequest
2 голосов
/ 19 февраля 2010

У меня есть функция вне моего EDM, которую я хотел бы включить в некоторые из моих выражений Linq to Entities. Функция возвращает IEnumerable из Int. Пример того, как я мог бы использовать это:

context.Employees.Where(e => GetValidEmployeeIds().Contains(e.EmployeeId));

Функция GetValidEmployeeIds - это функция, которая возвращает IEnumerable. Результат этой функции - не то, что я могу получить из базы данных - мне в значительной степени приходится получать ее извне из EDM.

Когда я выполняю строку кода, я получаю «LINQ to Entities не распознает метод» - что делает с тех пор. Однако, если я прерву вызов выражения, он будет работать нормально:

var validEmployees = GetValidEmployeeIds(); 
context.Employees.Where(e => validEmployees.Contains(e.EmployeeId));

У меня такой вопрос: могу ли я что-нибудь сделать, чтобы дать команду Linq to Entities не анализировать функцию как часть выражения? Чтобы вместо этого проанализировать результат функции. Я надеялся, что есть атрибут, которым я мог бы украсить метод, но не смог найти его.

Обычно я был бы в порядке, просто прерывая вызов и не используя его непосредственно в выражении. Тем не менее, я собираюсь часто использовать этот вызов и надеялся немного очистить код.

1 Ответ

1 голос
/ 19 февраля 2010

Нет, вам нужно переместить вызов функции:

Т.е., это:

var q = Context.Entities.Where(e => e.Something == DoStuff());

... должно стать:

var stuff = DoStuff();
var q = Context.Entities.Where(e => e.Something == stuff);

Однако, , если вы можете поместить свою функцию в Expression, то вы можете использовать это непосредственно:

var stuff = DoStuff();
Expression<Func<Entity, bool>> predicate = e => e.Something == stuff;
var q = Context.Entities.Where(predicate);

... так что вы можете очистить свой вырез и вставить таким образом.

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