Не удается перевести метод расширения в выражение магазина - PullRequest
0 голосов
/ 31 января 2012

У меня есть метод расширения следующим образом:

public static bool SatisfiesSomeCondition(this Post post, SomeObj someObj)
{
   return post.SomeObjId == someObj.SomeObjId;
}

И я пытаюсь использовать его так:

var query = ctx.Posts.Where(p => p.SatisfiesSomeCondition(someObj)).ToList();

Но я получаю ошибку:

LINQ to Entities не распознает метод «Boolean SatisfiesSomeCondition (xx.xx.xx.Post, xx.xx.xx.SomeObj)», и этот метод нельзя преобразовать в выражение хранилища.

Если я изменю запрос на:

var query = ctx.Posts.Where(p => p.SomeObjId == someObj.SomeObjId).ToList();

, который идентичен методу.

Он отлично работает и выполняет ожидаемый T-SQL.

Почему мой первый запрос не работает?Это статический метод, разве он не может понять, как создать дерево выражений?(например, фильтр WHERE).Конечно, мне не нужно сначала материализовать запрос?(это означает, что записи, которые я не хочу возвращать по проводам, и я делаю здесь пейджинг / упорядочивание, так что это не вариант).

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

Есть идеи?

Ответы [ 2 ]

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

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

public static IQueryable<Post> SatisfiesSomeCondition(this IQueryable<Post> query, SomeObj someObj)
{
   int id = someObj.SomeObjId;
   return query.Where(post => post.SomeObjId == id);
}

и используйте его как:

var query = ctx.Posts.SatisfiesSomeCondition(someObj)).ToList();

Таким образом, это должно работать. Вы можете объединить несколько Where условий в одном запросе, поэтому он должен предложить вам хотя бы базовую возможность повторного использования.

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

Движок LINQ to Entities не может узнать, что делает ваш статический метод.
LINQ-запросы можно переводить только из деревьев выражений.

...