Linq в сочетании с ошибкой построения пользовательского универсального метода расширения - Дерево выражений может не содержать оператор присваивания? - PullRequest
2 голосов
/ 22 февраля 2012

Я создал универсальный метод расширения, который выполняет действие над объектом и возвращает объект после этого:

    public static T Apply<T>(this T subject, Action<T> action)
    {
        action(subject);
        return subject;
    }

Я не могу использовать этот метод расширения в запросе EntityFramework Linq из-за:

Дерево выражений может не содержать оператор присваивания

Почему это так?

Запрос Linq:

var parents = from p in context.Parent
               join phr in context.Child on p.key equals phr.parentkey
               into pr
               select p.Apply(
                      x => x.Children = //The assignment operator that fails to build...
                      pr.ToDictionary(y => y.childkey, y => y.childname));

1 Ответ

3 голосов
/ 22 февраля 2012

Хорошо, если оставить в стороне оператор присваивания, как бы вы ожидали, что ваш Apply метод будет переведен в SQL?Entity Framework ничего не знает об этом и не может углубляться в непрозрачные делегаты.

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

var dbQuery =  from p in context.Parent
               join phr in context.Child on p.key equals phr.parentkey into pr
               select new { p, phr };

var localQuery = dbQuery.AsEnumerable()
                        .Select(pair => /* whatever */);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...