EF core 3.1 не может выполнить сложный необработанный запрос sql - PullRequest
1 голос
/ 23 января 2020

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

query:

// 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 типа root, так и для типа, который мне интересен
  • Не удалось ни с ни FromSqlRaw, ни FromSqlInterpolated
  • Добавление 'AsEnumerable' тоже не помогло

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

Ответы [ 3 ]

1 голос
/ 28 января 2020

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

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

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

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

0 голосов
/ 05 февраля 2020

Я нашел обходной путь для этой проблемы,

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

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

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

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

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq -queries-no-Больше не оценивается на клиенте

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

...