[英]Entity Framework Core LINQ Tree Expression Problem with Concat
所以我有一個 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))
這顯然也沒有轉換為 Entity to SQL,因為它正是我在表達式樹中構建的。 然而,改成這樣......
.ThenByDescending(e => e.FirstName + " " + e.LastName)
確實轉換為實體到 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' ')
這正是實體框架生成 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 版本中找到它。 機會是不可能的,因為這有點神秘,而且它們被更常見的問題所淹沒。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.