Entity Framework Core Проблема выражения дерева LINQ с Concat - PullRequest
2 голосов
/ 11 марта 2020

Итак, у меня есть расширение IQueryable, которое делает немного больше, чем этот блок кода. По сути, я объединяю кучу строк, а потом делаю на них содержимое. Проблема, с которой я сталкиваюсь, заключается в том, что Entity Framework Core не поддерживает System.String.Concat и выполняет эту часть запроса локально, что, безусловно, не то, что я хочу.

Вот маленький l oop, который я использовал для добавления этих разных строк:

                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 в SQL, так как это именно то, что я строю в своем дерево выражений. Однако, изменив его на это ....

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

Преобразуется в сущность в SQL. Поэтому мне интересно, как я могу создать такое же выражение, представленное в приведенном выше коде, которое правильно отправляется на SQL. Я пытался использовать Expression.Add, но add не поддерживается для строковых типов в построителе выражений. Возможно ли это, или в Entity Framework есть дополнительный код, который делает это возможным? Я пытался изучить исходный код на GitHub, но немного сложно найти, где именно это происходит.

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Aha! Я понял это !! Это дерево выражений демонстрирует то же поведение и отправляет данные в 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 может перевести в sql, вот оно!

Благодарим за этот ответ за указание в правильном направлении: { ссылка }

0 голосов
/ 11 марта 2020

В основном: подождите, пока EfCore не поддержит это в какой-то момент, или используйте Ef classi c сейчас.

EfCore очень ограничен в том, что он поддерживает из LINQ - похоже на людей, разрабатывающих его никогда не использовал его и никогда не читал обо всем, что может LINQ. Нет никакого обходного пути.

В EfCore 2.2 он выполнял оценку на стороне клиента - в 3.1 он отключен, и он говорит вам go и программирует по-другому.

Если вам так хочется, откройте вопрос на странице GitHub, а затем, возможно, кто-то подберет его для выпуска в ноябре 5.0. Шансов нет, потому что это немного более загадочно, и они перегружены проблемами, которые встречаются гораздо чаще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...