EF Core Distinct + OrderBy выдает ошибку перевода - PullRequest
0 голосов
/ 04 августа 2020

Я столкнулся с действительно неприятной ошибкой EF Core (новейшая версия). На данный момент я не уверен, делаю ли я что-то не так или это ошибка. Мы будем признательны за любую помощь, которую может предоставить сообщество.

Ошибка связана с Entity Framework Core и переводом выражения LINQ в SQL. Приведенный ниже код правильно переводится как SQL. Переменная запроса ниже может потенциально иметь множество выражений Where и Includes, применяемых к ней без проблем.

// This works fine
query.Select(price => new Customer {
   Name = price.Payer.Name,
   Code = price.Payer.Code,
   City = price.Payer.City,
   ParentCode = price.Payer.ParentCode,
   ParentLevel = CustomerLevel.Corporate,
   CustomerLevel = CustomerLevel.Payer
}).Distinct().ToListAsync();

Как только я добавлю вызов в OrderBy, он не будет оценивать. Если я удалю вызов Distinct, он снова будет работать, но у меня не может быть обоих. Я пробовал несколько разных способов построить выражение и несколько обходных решений, которые я нашел в interwebz, и, похоже, ничего не решает это.

// This throws error
// query is of type IQueryable<Price>
query.Select(price => new Customer {
   Name = price.Payer.Name,
   Code = price.Payer.Code,
   City = price.Payer.City,
   ParentCode = price.Payer.ParentCode,
   ParentLevel = CustomerLevel.Corporate,
   CustomerLevel = CustomerLevel.Payer
}).Distinct().OrderBy(cust => cust.Name).ToListAsync();

Кроме того, размещение OrderBy не имеет значения. Судя по тому, что я читал, звонок на Distinct удаляет все предыдущие заказы, так что это неудивительно.

// This also throws error
// query is of type IQueryable<Price>
query
   .OrderBy(price => price.payer.Name)
   .Select(price => new Customer {
      Name = price.Payer.Name,
      Code = price.Payer.Code,
      City = price.Payer.City,
      ParentCode = price.Payer.ParentCode,
      ParentLevel = CustomerLevel.Corporate,
      CustomerLevel = CustomerLevel.Payer
   }).Distinct().ToListAsync();

1 Ответ

0 голосов
/ 04 августа 2020

Сегодня я действительно нашел причину проблемы. Свойство ParentCode (используемое в строке ParentCode = price.Payer.ParentCode) на самом деле является свойством базового класса, которое не сопоставлено с таблицей, поэтому EF, по-видимому, не знал, что с ним делать. Очень странно то, что он работал без OrderBy. Изменение этой строки на ParentCode = price.Payer.CorporateCode решило проблему.

Спасибо всем, кто на это посмотрел.

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