EF core 3.1 не может выполнять сложный необработанный запрос sql

Следующий запрос работал нормально с ядром EF 2, но ядро ​​EF 3 вызывало ошибку! Я даже мог бы добавить некоторые включения после этого запроса в EF core 2, который я сейчас отпустил.

запрос:

// just to have an Id
var id = Guid.NewGuid();
var resutl = Context.Parties.FromSqlInterpolated($@"WITH mainOffice AS 
             (SELECT * FROM Parties as o1 WHERE (Discriminator = N'Office')
              AND (Id = '{id}') 
              UNION ALL SELECT o.* FROM Parties AS o INNER JOIN mainOffice AS m 
              ON m.Id = o.ParentOfficeId)
              SELECT * FROM mainOffice as f").ToList();

Ошибка, которую он производит, выглядит следующим образом:

FromSqlRaw или FromSqlInterpolated были вызваны с несоставным SQL и запросом, составляющим его. Рассмотрите возможность вызова AsEnumerable после метода FromSqlRaw или FromSqlInterpolated для выполнения композиции на стороне клиента.

Может помочь следующая информация:

  • Таблица «Стороны» - это таблица по иерархии.
  • Я попытался выполнить запрос как из корневого типа DbSet, так и из интересующего меня типа
  • Нет успеха ни с FromSqlRaw, ни с FromSqlInterpolated
  • Добавление AsEnumerable тоже не помогло

Я что-нибудь забыл? Что я делаю неправильно? Что означает «некомпонованный SQL»? Означает ли это, что ядро ​​EF пытается интерпретировать запрос?


person mesmoll    schedule 23.01.2020    source источник
comment
Можете выложить код там, где вызываете запрос?   -  person A_kat    schedule 23.01.2020
comment
Я обновил вопрос, включив в него код, который вызывает запрос @AntoniosKatopodis   -  person mesmoll    schedule 23.01.2020
comment
Известная проблема. Команда EF немного борется с проверками компоновки.   -  person Gert Arnold    schedule 23.01.2020
comment
Это также усугубляет проблему: github.com/dotnet/efcore/issues/18257   -  person Grimm    schedule 28.01.2020


Ответы (3)


У меня нет ответа, но теперь я знаю причину.

Причина возникновения этой ошибки аналогична этой проблеме: Метод FromSql при использовании с хранимой процедурой не может быть составлен

В моем случае, погода или нет, я использую какой-либо метод, поскольку таблица, которую я пытаюсь запросить, содержит какой-то другой тип (таблица на иерархию), мой запрос всегда будет искажен внутри запроса выбора, чтобы ограничить дискриминаторы. Несмотря на то, что я пишу запрос из корня, запрос выбора оболочки генерируется со всеми возможными дискриминаторами.

Это означает, что я могу выполнять только запросы, которые можно разместить как подзапрос. Мой запрос не может, хранить процедуры нельзя ...

person mesmoll    schedule 28.01.2020

Может быть связано?

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq-queries-are-no-longer-evaluated-on-the-client

Неявно Efcore 2 выполнял linq для объектов в частях запроса, которые он не мог преобразовать в sql. Эта функция была удалена в efcore 3.

person rgvlee    schedule 23.01.2020

Я нашел способ обойти эту проблему,

Вы можете создать представление в базе данных и тип запроса в своей модели, а затем запустить свой запрос для этого представления (обратите внимание, что способ, которым вы это делаете, был изменен с ef 2 на 3, как это объясняется здесь)

Таким образом, наследование и дискриминаторы больше не являются проблемой, и можно выполнять запросы.

person mesmoll    schedule 05.02.2020