Наше развитие натолкнулось на крупный блокпост с точки зрения полей от 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 (). Однако для анонимных / сложных типов и / или скалярных запросов мы не видим места, куда можно зацепиться.
Любые предложения приветствуются.