【发布时间】:2020-03-11 17:51:58
【问题描述】:
所以我有一个 IQueryable 扩展,它的功能比这段代码多一点。本质上,我正在组合一堆字符串,然后对它们进行包含。我遇到的问题是 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))
这显然也没有将实体转换为 SQL,因为它正是我在表达式树中构建的。但是,将其更改为这个....
.ThenByDescending(e => e.FirstName + " " + e.LastName)
确实将实体转换为 SQL。所以我想知道如何创建上面代码中表示的正确发送到 SQL 的相同表达式。我试过使用 Expression.Add 但表达式生成器中的字符串类型不支持添加。这是可能的,还是实体框架中有一些额外的代码使这成为可能?我尝试在 GitHub 上探索源代码,但要找到它发生的确切位置有点让人不知所措。
【问题讨论】:
标签: c# .net-core entity-framework-core expression-trees