gpt4 book ai didi

c# - Entity Framework Core LINQ 树表达式问题与 Concat

转载 作者:行者123 更新时间:2023-12-04 10:25:35 26 4
gpt4 key购买 nike

所以我有一个 IQueryable 扩展,它的功能比这段代码多一点。本质上,我是在组合一堆字符串,然后对它们执行 Contains。我遇到的问题是 Entity Framework Core 不支持 System.String.Concat,并在本地执行那部分查询,这绝对不是我想要的。

这是我用来将这些不同的字符串加在一起的小循环:

                List<Expression> stringExpressionsToConcat = new List<Expression>();
foreach (var member in memberExpressions)
{
stringExpressionsToConcat.Add(member);
stringExpressionsToConcat.Add(spaceConstant);
}
//call the concat to create the final term to search on
NewArrayExpression arrayExpression = Expression.NewArrayInit(typeof(string), stringExpressionsToConcat);
searchStringExpression = Expression.Call(concatMethod, arrayExpression);

这是工作的客户端,但不会为 Entity to SQL 编译。我在 Order By 子句上遇到了同样的问题,我正在做这样的事情:

.ThenByDescending(e => string.Concat(e.FirstName, " ", e.LastName))

这显然也没有将 Entity 转换为 SQL,因为它正是我在表达式树中构建的内容。但是,将其更改为......

.ThenByDescending(e => e.FirstName + " " + e.LastName)

将实体转换为 SQL。所以我想知道如何创建上面代码中表示的相同表达式,并正确发送到 SQL。我试过使用 Expression.Add,但表达式构建器中的字符串类型不支持添加。这是可能的还是 Entity Framework 中有一些额外的代码使这成为可能?我已尝试在 GitHub 上探索源代码,但要准确找到它发生的位置有点让人不知所措。

最佳答案

啊哈!我想通了!!此表达式树表现出相同的行为并将数据发送到 SQL!

修改后的代码:

//more than one member has the property, we need to combine them with spaces in between
List<Expression> stringExpressionsToConcat = new List<Expression>();
foreach (var member in memberExpressions)
{
stringExpressionsToConcat.Add(member);
stringExpressionsToConcat.Add(spaceConstant);
}

searchStringExpression = stringExpressionsToConcat[0];
for (int i = 1; i < stringExpressionsToConcat.Count; i++)
{
searchStringExpression = Expression.Add(searchStringExpression,
stringExpressionsToConcat[i], typeof(string).GetMethod("Concat", new[] {
typeof(string), typeof(string) }));
}

该更改从 Entity Framework 抛出 2.2 中的警告(以及 3.1 中的错误)到将其转换为以下 SQL 代码!

([e].[MemberExpression1] + N' ') + [e].[MemberExpression2]) + N' ') + [e].[MemberExpression3]) + N' ')

这正是 Entity Framework 生成 SQL 子句的方式,我在对 Order By 的回答中谈到过!我不确定推理是什么......但是,如果您希望创建自己的表达式树,将字符串加在一起,Entity Framework Core 树访问者可以将其转换为 sql,就是这样!

感谢这个答案为我指明了正确的方向: https://stackoverflow.com/a/3858421/5245385

关于c# - Entity Framework Core LINQ 树表达式问题与 Concat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60641911/

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