2010-07-27 3 views
3

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

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 <T> (имя строки, внутр 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 

EDIT: Я понимаю, что мне нужно использовать ExpressionVisitor для достижения этой цели, но я не знаете, как использовать ExpressionVisitor для изменения MemberInitExpression, поэтому, если кто-нибудь знает, как это сделать, сообщите мне.

+2

Вы когда-нибудь находили решение этого вопроса? – Rabbi

ответ

0

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

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

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

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

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

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

+2

Ну, проблема не в анонимном типе, проблема в том, что мне нужно вставить выражение в другое выражение по существу, и я бы предпочел сделать это, не выполняя все элементы MemberInitExpression. – Daniel

+0

. Вы можете подумать, что мой ответ не имеет ничего общего с сделайте с вашей проблемой, но ваш код не работает, не так ли? –

+1

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