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

2024-05-22

我正在尝试使用我在尝试执行 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
                });

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

仅供参考,EntitiesExpressionHelper.MakeTranslationExpression(string name, 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,因此如果有人知道如何完成此操作,请告诉我。


您需要捕获 vars 中的表达式。您将无法使用匿名类型。总体思路是这样的:

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

但这不会:

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

第一个快乐地通过了result of GenExpression到L2E。第二个尝试通过GenExpression itselfL2E,而不是结果。

因此,您需要引用与表达式相同类型的 var。这些不能隐式类型化,因此您的结果类型需要一个真实类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Select 语句中调用表达式 - LINQ to Entity Framework 的相关文章

随机推荐