LINQ to SQL - Проблема с полем Xml - Как низко вы можете перехватить сгенерированный TSQL? - PullRequest
4 голосов
/ 11 февраля 2011

Наше развитие натолкнулось на крупный блокпост с точки зрения полей от Linq до Sql и Sql 2005+ Xml. У нас есть поле Xml blob, содержащее поля ...

<Profile name-first="Terry" name-last="Aney" [...more]/>

Чтобы использовать LINQ to SQL, мы создали UDF в SQL и добавили его в наш DataContext и вызвали его (свободно на основе LINQ to SQL (Часть 6 - Получение данных с использованием хранимых процедур) ). Однако, когда мы используем эти функции, индексирование XML с помощью SQL становится бесполезным. Отфильтрованный и упорядоченный запрос по совокупности из 14 000 строк, и время его ожидания истекло с 30-секундным значением CommandTimeout по умолчанию. Но если мы возьмем текст команды (сниффер SQL Profiler) и поменяем UDF с прямым XQuery, запрос займет меньше секунды (очевидно, что мы хотим). Я видел похожие вопросы о полях Xml (т. Е. этот вопрос ), но общий ответ заключается в использовании UDF - но мы доказали, что они неэффективны, если используются широко.

Мы надеемся, что есть некоторая точка низкого уровня, где мы можем получить текст команды и заменить UDF с правильным синтаксисом XQuery (через RegEx). Не идеально, но это единственное решение, которое мы видим возможным. Мы открыты для всего: перевода команд, интеграции CLR с SQL и т. Д.

В определенных ситуациях мы могли бы сделать это уже. Например, если у нас всегда есть IQueryable, где T не является анонимным и / или сложным / вложенным типом, мы можем вызвать GetCommandText, а затем вызвать DataContext.Translate (). Однако для анонимных / сложных типов и / или скалярных запросов мы не видим места, куда можно зацепиться.

Любые предложения приветствуются.

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Итак, вот некоторые соображения, функция в этом будет вызываться для каждой из возвращаемых строк, что приводит к снижению производительности, но, очевидно, Linq to SQL не является большим поклонником полей XML, как вы, вероятно, заметили.Таким образом, возможное решение состоит в том, чтобы попытаться действительно оптимизировать функцию, и лучший способ сделать это - использовать SQLCLR, поэтому взгляните на эту ссылку и посмотрите, как он это сделал.

http://conficient.wordpress.com/2011/01/20/querying-xml-fields-in-linq-to-sql/

0 голосов
/ 14 марта 2011

К вашему сведению, мой коллега «решил» проблему.Немного «зло», но делаю работу за нас.http://chriscavanagh.wordpress.com/2011/03/12/manipulating-linq-to-sql-command-text/

Итак, теперь, когда мы можем изменить, мы создали некоторые функции-заполнители в нашем L2S DataContext, которые, очевидно, являются UDF.Но мы перехватываем команду и меняем их для правильного синтаксиса значения XQuery / exist (), чтобы убедиться в его максимальной производительности.

...