2009-11-16 1 views
3

Мне нужно выбрать строки из таблицы базы данных, используя фильтрацию по столбцу типа XML.Фильтрация записей базы данных по содержимому столбца xml с использованием linq-to-sql и xlinq

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

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, w без обработки набора данных в приложении webservice.

Спасибо.

ответ

3

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

  • написать SPROC/UDF для всего запроса, который использует синтаксис SQL/XML, и карту, что ваши данные контекста
  • написать пользовательскую функцию, которая делает тест на один строка (возвращает логическое значение), карта, что в данном контекст, и использовать ctx.SomeUdf(row) в предложении о where LINQ
1

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

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

+0

спасибо за идею. – tomo

Смежные вопросы