所以我有一个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编译为SQL。我在执行类似以下操作的Order By子句中遇到了相同的问题:
.ThenByDescending(e => string.Concat(e.FirstName, " ", e.LastName))
这显然也没有转换为Entity to SQL,因为它正是我在表达式树中构建的。但是,将其更改为此。...
.ThenByDescending(e => e.FirstName + " " + e.LastName)
[转换为Entity to SQL。所以我想知道如何创建上面代码中表示的相同表达式,并将其正确发送到SQL。我尝试使用Expression.Add,但表达式构建器中的字符串类型不支持add。这可能吗?或者实体框架中是否有一些额外的代码可以实现这一点?我试图在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
基本上:请等待EfCore支持此功能,或暂时使用Ef classic。
EfCore对LINQ的支持非常有限-感觉就像开发人员从未使用过它,也从未阅读过LINQ的所有内容。这不是解决方法。
在EfCore 2.2中,它正在进行客户端评估-在3.1中已被禁用,它告诉您去编程不同。
[如果您愿意,请在github页面上打开一个问题,然后有人可以在11月5.0版中选择它。不会的原因是,这有点不可思议,而且它们充满了更常见的问题。