簡體   English   中英

實體框架核心 LINQ 樹表達式問題與 Concat

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM