#sql-server #entity-framework #linq-to-entities
#sql-сервер #entity-framework #linq-to-entities
Вопрос:
Я искал расширение linq к сущностям, которое позволяет добавлять ОПЦИЮ (MAXDOP x) к сгенерированному запросу. Для запросов я хочу ограничить их ресурсы SQL Server.
Что-то вроде:
Customers.WithMaxDop(2).Where(...) ..
Не удалось найти.
Прежде чем я попытаюсь вникнуть в суть, чтобы создать свое собственное расширение, я хотел сначала попросить вас, ребята, о помощи — как бы вы предложили это сделать?
Спасибо!
Ответ №1:
Это подсказка к запросу, которая не может быть добавлена методом расширения. Вы должны либо создать полностью новый поставщик EF, либо перенести запрос с подсказкой в представление базы данных и отобразить представление как новую сущность, доступную только для чтения.
EF — это абстракция поверх базы данных (теоретически любой базы данных) — предполагается, что она не предоставляет вам контроль над такими деталями БД. Если вам нужны эти сведения, вы должны закодировать их на уровне базы данных и предоставлять EF только представления или хранимые процедуры.
Комментарии:
1. Привет, tnx за твой ответ. Как насчет трюков, подобных этому решению: aneyfamily.com/terryandann/post/2008/04 /… — перехватите сгенерированный текст sql, затем обработайте его, введя опцию подсказки (..), и только после этого запустите запрос.. хотя тогда я теряю результат как сущности.
2. Это было бы довольно серьезным обходным решением, и это будет похоже на выполнение вашего собственного пользовательского SQL-запроса через
context.ExecuteStoreQuery
— вы потеряете функциональность, такую как eager loding. Вы можете получить SQL, сгенерированный путем приведения вашего запроса кObjectQuery
и использованияToTraceString
. Имейте в виду, что EF иногда создает действительно большие запросы, поэтому синтаксический анализ и модификация такого запроса могут быть очень сложными, подверженными ошибкам и замедлять работу.3. Черт возьми, везде, куда я обращаюсь с EF, я закрываюсь. Я запрашиваю данные, которые действительно требуются ребятам из DBops (maxdop 2) или какой-то nolock. черт возьми, черт возьми…
4. Вот интересная статья о MAXDOP и пороговом значении затрат для параллелизма. Последнее может быть менее сложным решением: [ sql-server-performance.com/2014/maximum-degree-parallelism /]
Ответ №2:
Похоже, что теперь это возможно с EF Core 3.x. Вы можете «Перехватывать работу базы данных» на низком уровне до и / или после операции. В примере, предоставленном Microsoft, они добавили подсказку в конце запроса.
command.CommandText = " OPTION (OPTIMIZE FOR UNKNOWN)";
Однако я не знаю, произойдет ли это для каждой операции или вы можете применить эти перехваты только к выбранным командам.
Дополнительная информация здесь: https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.x/#interception-of-database-operations