XQuery в Linq To Entities для Sql Server XML Тип данных - PullRequest
3 голосов
/ 23 июля 2010

Я пытаюсь выяснить, как выполнить запрос Linq To Entities для базы данных SQL Server, которая содержит тип данных XML:

Я хочу выполнить запрос на уровне базы данных, который возвращает только указанный узел XML, содержащий более 2000 символов

Возможно ли это в Linq To Entities?

Обновление

ну, я хочу сделать что-то подобное в linq-to-entity, но я не думаю, что это возможно

var q = from c in Changes
 where c.Content.XPathSelectElement("OpsNotes").Value.Length >= 2000;
 select c;

внутри базы данных сервера sql содержимое XML представляет собой узел с именем "OpsNotes"

 <Content Type="AP" Version="1">
  <Name>CPU FAIL-OVER</Name>
  <Bands>
    <Band>BAND DATA</Band>
  </Bands>
  <StartTime IsCritical="false" IsTimeSet="true">2009-12-06T14:00:00.0000000Z</StartTime>
  <Duration>00:30:00</Duration>
  <RecurrenceRule>RRULE:[List]{340/2009}</RecurrenceRule>
  <OpsNotes>Rationale: Support standard weekly DVIS CPU fail-over</OpsNotes>
   </Content>

Ответы [ 2 ]

1 голос
/ 23 июля 2010

Я был бы удивлен, если бы это было возможно, напрямую.

Вам больше всего нужно будет сделать один из двух обходных путей:

  • извлекает XML из поля SQL Server в виде строки и помещает его в XDocument (Linq-to-XML) или XmlDocument (обработка на основе DOM) и выполняет свои трюки с ним

или

  • обрабатывает запросы на самом SQL Server, используя SQL Server XQuery, и возвращает результаты в виде строк, целых чисел и т. Д. - все, что вам нужно сделать

Лично я бы предпочел опцию обработки содержимого XQuery на самом сервере - для того, чтобы помочь вам с вашей конкретной проблемой, вам нужно будет предоставить пример XML и объяснение того, что вы хотите сделать ... .

Обновление: для вашего требования, в SQL Server XQuery вам нужно написать что-то вроде:

var q = from c в Изменениях где c.Content.XPathSelectElement ("OpsNotes"). Value.Length> = 2000; выберите c;

SELECT (list of fields)
FROM dbo.Changes c
WHERE c.Content.value('(string-length(string((/Content/OpsNotes)[1])))', 'int') >= 2000

или что-то в этом роде.

В качестве дополнительного бонуса в этом случае вам нужно будет только перенести меньшее количество строк обратно с сервера на ваше клиентское приложение, поскольку сервер уже отфильтровывает все несовпадающие строки.

0 голосов
/ 23 июля 2010

Для этого вам придется написать SQL.

В EF 4 вы можете использовать ExecuteStoreQuery для выполнения произвольного SQL с результатами типа объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...