在Select语句中调用表达式 - LINQ to Entity Framework

时间:2010-07-27 21:20:41

标签: linq linq-to-entities lambda linq-expressions

我正在尝试使用我在尝试执行select子句时已经存在的Expression构建类,但我不确定如何将表达式附加到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
                });

但我明显得到错误,指出实体框架无法将Invoke映射到SQL方法。有办法解决这个问题吗?

仅供参考,EntitiesExpressionHelper.MakeTranslationExpression&lt; T&gt;(字符串名称,int语言ID)相当于:

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 个答案:

答案 0 :(得分:1)

您需要捕获变量中的表达式。您将无法使用匿名类型。一般的想法是,这是有效的:

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

但这不会:

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

第一个愉快地将GenExpression结果传递给L2E。第二个尝试将GenExpression 本身传递给L2E,而不是结果。

因此,您需要引用与表达式相同类型的var。那些不能隐式输入,所以你需要一个真实的类型为你的结果类型。