Вызов выражения в операторе Select - LINQ to Entity Framework - PullRequest
3 голосов
/ 28 июля 2010

Я пытаюсь использовать уже существующий класс построения 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. Есть ли способ обойти это?

FYI, EntitiesExpressionHelper.MakeTranslationExpression (имя строки, 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, поэтому, если кто-нибудь знает, как это сделать, дайте мне знать.

1 Ответ

1 голос
/ 28 июля 2010

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

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

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

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

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

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

...