Вызов выражения в операторе Select — LINQ to Entity Framework

Я пытаюсь использовать уже существующий класс построения Expression, который я создал при попытке сделать предложение select, но я не уверен, как прикрепить выражение к дереву выражений для Select, я попытался сделать следующее:

var catalogs = matchingCatalogs.Select(c => new
                {
                    c.CatalogID,
                    Name = EntitiesExpressionHelper.MakeTranslationExpression<Catalog>("Name", ApplicationContext.Instance.CurrentLanguageID).Compile().Invoke(c),
                    CategoryName = EntitiesExpressionHelper.MakeTranslationExpression<Category>("Name", ApplicationContext.Instance.CurrentLanguageID).Compile().Invoke(c.Category),
                    c.CategoryID,
                    c.StartDateUTC,
                    c.EndDateUTC
                });

Но я, очевидно, получаю сообщение об ошибке, в котором говорится, что Entity Framework не может сопоставить Invoke с методом SQL. Есть ли способ обойти это?

К вашему сведению, EntitiesExpressionHelper.MakeTranslationExpression‹T›(строковое имя, int languageID) эквивалентно:

x => x.Translations.Count(t => t.LanguageID == languageID) == 0 ? x.Translations.Count() > 0 ? x.Translations.FirstOrDefault().Name : "" : x.Translations.FirstOrDefault(t => t.LanguageID == languageID).Name

РЕДАКТИРОВАТЬ: я понимаю, что для этого мне нужно использовать ExpressionVisitor, но я не уверен, как использовать ExpressionVisitor для изменения MemberInitExpression, поэтому, если кто-нибудь знает, как это сделать, дайте мне знать.


person Daniel    schedule 27.07.2010    source источник
comment
Вы когда-нибудь находили решение этой проблемы?   -  person Rabbi    schedule 23.01.2013


Ответы (1)


Вам нужно зафиксировать выражения в vars. Вы не сможете использовать анонимные типы. Общая идея заключается в том, что это работает:

Expression<Func<Foo, Bar>> exp = GenExpression();
var q = matchingCatalogs.Select(exp);

Но этого не будет:

var q = matchingCatalogs.Select(GenExpression());

Первый успешно передает результат GenExpression в L2E. Второй пытается передать GenExpression себя в L2E, а не результат.

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

person Craig Stuntz    schedule 27.07.2010
comment
Ну, проблема не в анонимном типе, проблема в том, что мне нужно ввести выражение в другое выражение, по существу, и я бы предпочел сделать это без необходимости выполнять весь материал MemberInitExpression - person Daniel; 28.07.2010
comment
Вы можете подумать, что мой ответ не имеет ничего общего с вашей проблемой, но ваш код не работает, не так ли? - person Craig Stuntz; 28.07.2010
comment
Я вовсе не это говорю, я просто говорю, что это решение другой проблемы. Проблема, с которой я столкнулся, заключается в том, чтобы в основном манипулировать существующими деревьями выражений. - person Daniel; 28.07.2010