gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:38:28 25 4
gpt4 key购买 nike

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

但我显然收到错误消息,指出 Entity Framework 无法将 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());

第一个愉快地传递了 GenExpression的结果到 L2E。第二次尝试通过 GenExpression本身到 L2E,而不是结果。

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

关于linq - 在 Select 语句中调用表达式 - LINQ to Entity Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3348099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com