Фильтрация записей базы данных по содержимому столбца xml с использованием linq-to-sql и xlinq - PullRequest
3 голосов
/ 16 ноября 2009

Мне нужно выбрать строки из таблицы базы данных, используя фильтрацию по столбцу типа xml.

таблица выглядит (короткая версия)

id
dbfield int
xmlfield xml

и я фильтрую это таким образом

IQueryable<Data.entity> q = from u in datacontex.entities
select u;

if (val1.HasValue)
  q = q.Where( x => x.dbfield > val1.value)

if (val2.HasValue)
  q = q.Where( x=> x.dbfield < val2.value)

if (!string.IsNullOrEmpty(searchString))
 q = q.Where ( x=> x.xmlfield contains values from searchString)

XML в xmlfield очень прост, похоже,

<doc>
  <item id="no">test/WZ/2009/04/02</item>
  <item id="title">blabla</item>
...

Вопрос в том, как добавить условие WHERE в linq, и желательно, чтобы это разделение преобразовывалось в запрос ms-sql без обработки набора данных в приложении веб-службы.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 16 ноября 2009

LINQ-to-SQL не поддерживает AFAIK расширения xml в TSQL. Два варианта, которые я вижу:

  • напишите SPROC / udf для всего вашего запроса, который использует синтаксис sql / xml, и сопоставьте его с вашим контекстом данных
  • написать UDF, который выполняет тест для одной строки (возвращая bool), сопоставить его с контекстом данных и использовать ctx.SomeUdf(row) в предложении where в LINQ
1 голос
/ 16 ноября 2009

Вы также можете создать вычисляемые столбцы в таблице SQL Server, которые извлекают эти фрагменты из XML и сохраняют их, как если бы они были «обычными» полями в таблице. Я использую эту технику в разных местах все время в производственных системах - отлично работает.

После того, как вы это сделаете, вы сможете использовать такие же поля, как обычные поля таблицы, и использовать их для фильтрации в Linq-to-SQL - без проблем.

...