Ошибка EF: выражение LINQ не может быть переведено. Происходит с сгенерированным выражением, а не с кодомC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка EF: выражение LINQ не может быть переведено. Происходит с сгенерированным выражением, а не с кодом

Сообщение Anonymous »

Работая в .net 8, я создаю метод в своем классе репозитория, который принимает объект, называемый критериями и запросит EF на основе условий в этом объекте. Критерии способны генерировать выражение, которое затем передается методу разгибания where () для запроса. Проблема заключается в том, что для конкретного дерева выражения я получаю исключение, что не происходит , если я предоставляю то же выражение, что и код. /> Исключение, которое это создает: «System.InvalidoPerationException: 'Expression' y 'y' не может быть переведено. Либо переписывайте запрос в форме, которую можно перевести, либо явно переключив клиентскую оценку. Найдите это исключение неясным, потому что оно жалуется на «Y», который является параметром для вложенной лямбды. Я не могу представить, что может быть не так с этой частью выражения. < /P>
public async Task GetByCriteria(ICriteria criteria)
{
// Using an expression in code
var test = _dbContext.Set()
.Where(x => x.UserRoles.Any(y => y.RoleNo == 100101)).AsNoTracking();

List codeEntities = await test.ToListAsync();
< /code>
Работает вышеуказанный код. Здесь я использую кодированное выражение в вызове where () < /p>
public async Task GetByCriteria(ICriteria criteria)
{
Expression expression = criteria.AsExpression();

// Using a generated expression
var queryable = _dbContext.Set()
.Where(expression).AsNoTracking();

List exprEntities = await queryable.ToListAsync();
< /code>
Этот код создает исключение, когда называется tolistasync (). Переменная Expression является выражением, которое было сгенерировано объектом Criteria. В представлении отладки я вижу, что это выражение совпадает с тем, что в коде из до начала. Это не имеет значения. < /P>
Я сравнил запросываемые объекты из двух примеров в отладчике и не обнаружил различий между ними. не происходит . Я предполагаю, что это потому, что EF кэшировал первый (успешный) запрос и больше не пытается запрашивать второй. К сожалению, он не может сделать то, на что я надеялся. Это облегчает построение выражения верхнего уровня, которое представляет собой серию логических и не делает ничего для создания фактических условных выражений, что является здесь сложной частью. Мне нужно иметь возможность принимать динамические названия, значения и операторов динамических свойств и составлять их вместе, поэтому похоже, что API выражения все еще остается единственным способом.>

Подробнее здесь: https://stackoverflow.com/questions/784 ... erated-exp
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»