InvalidOperationException: не удалось перевести выражение LINQ '' - PullRequest
0 голосов
/ 24 января 2020
var baseQuery = Context.Questions.AsNoTracking().Where(x => x.Active && x.QuestionFoils.Any());   

// Получает 30

baseQuery = baseQuery.Where(x => x.QuestionReferences.Any()); 

// Получает 2

baseQuery = baseQuery.Where(
                     x => x.QuestionReferences.Any(qr => 
                     listNames.Any(name => 
                     name.FirstName == qr.Reference.ReferenceProfessors.Professor.FirstName &&
                     name.LastName == qr.Reference.ReferenceProfessors.Professor.LastName
                     )));
countCount = baseQuery.Count();

Когда я пытаюсь выполнить какую-либо операцию над запросом, выдается исключение InvalidOperationException: LINQ выражение '' не может быть переведено.

InvalidOperationException: выражение LINQ 'Any, ReferenceProfорес>, профессор >> (источник: LeftJoin, ReferenceProfорес>, профессор, Nullable, TransparentIdentifier, ReferenceProf Professor>, профессор> > (external: LeftJoin, ReferenceProfSSore, Nullable, TransparentIdentifier, ReferenceProfSS >> (external: Join, TransparentIdentifier> (external: Где (source: DbSet, Предикат: (q2) => Свойство> (EntityShaperExpression: EntityType: Вопрос ЗначениеBufferExpression: ProjectionBindingExpression: ProjectionBindingExpression EmptyProjectionMember IsNullable: False, "QuestionId") == Свойство> (q2, "QuestionId")), inner: DbSet, outerKeySelector: (q2) => Свойство> (q2, "ReferenceId"), innerKeySelector: (r) => Свойство> (r, "ReferenceId"), resultSelector: (o, i) => новый TransparentIdentifier (Outer = o, Inner = i)) , inner: DbSet, outerKeySelector: (q2) => Свойство> (q2.Inner, "ReferenceId"), innerKeySelector: (r0) => Свойство> (r0, "ReferenceId"), resultSelector: (o, i) => новый TransparentIdentifier, ReferenceProfutors> (Outer = o, Inner = i)), inner: DbSet, outerKeySelector: (q2) => Свойство> (q2.Inner, "ProfessorId"), innerKeySelector: (p) => Свойство> (p , "ProfessorId"), resultSelector: (o, i) => новый TransparentIdentifier, ReferenceProf Professor>, профессор> (Outer = o, Inner = i)), предикат: (q2) => Any (source: (необработанный параметр: __listNames_0 ), предикат: (name) => name.FirstName == q2.Inner.FirstName && name.LastName == q2.Inner.LastName)) 'не удалось перевести. Либо переписать запрос в форме, которую можно перевести, либо явно переключиться на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c (). См. https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.

Все с одной таблицей работает просто отлично:

baseQuery = baseQuery.Where(x => x.QuestionCourses.Any(qc => courses.Any(name => name == qc.Course.Name)));

Как бы я переписал следующее, чтобы не бросать эта ошибка?

  x => x.QuestionReferences.Any(qr => 
  listNames.Any(name => 
  name.FirstName == qr.Reference.ReferenceProfessors.Professor.FirstName &&
  name.LastName == qr.Reference.ReferenceProfessors.Professor.LastName
  ))

1 Ответ

0 голосов
/ 24 января 2020

Я полагаю, что проблема заключается в том, что вы пытаетесь отфильтровать выражение Linq с помощью объекта с 2 полями (name.FirstName & name.LastName), который не будет преобразован в SQL. EF может переводить список, содержащий / any, в предложения IN, но для единственного поля / выражения.

Что должно работать:

Объедините ваши имена в единый список строк. Например, «FirstName LastName» или «LastName, FirstName» затем объединяют имя профессора при сравнении:

x => x.QuestionReferences.Any(qr => 
  listNames.Any(name => name == qr.Reference.ReferenceProfessors.Professor.FirstName 
     + " " + qr.Reference.ReferenceProfessors.Professor.LastName ))

Где listNames = «FirstName LastName»;

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