2010-01-13 5 views
1

Возможно ли комбинировать Linq-to-SQL и Linq-to-XML, если столбец таблицы является XML?Объединение Linq-to-SQL и Linq-to-XML

+0

Что вы имеете в виду под «объединить»? –

+0

Linq to SQxML? :) –

+0

Я имею в виду выполнение sql-запроса с использованием xpath с linq to sql с использованием linq для xml в нем. –

ответ

3

Если под «объединить» вы имеете в виду «есть Linq для SQL перевести запрос в фактический SQL Server XML-запрос ", тогда я считаю, что ответ отрицательный. Но вам ничего не мешает вытащить данные XML и запустить на нем локальный XML-запрос.

Чтобы ответить на более общий вопрос «как работать с столбцом XML в этом сценарии», наилучшим подходом было бы создание пользовательской функции для обработки XML, если можно. Затем вы можете получить Linq для SQL для выполнения UDF.

В противном случае я бы отправил маршрут Хранимые процедуры.

+0

Действительно, но затем я получаю переполнение памяти, потому что многие записи возвращаются. –

+0

Ouch. См. Мое редактирование - надеюсь, UDF или SP могут работать для вас здесь. – Aaronaught

+0

Действительно, хранимая процедура будет моей следующей мыслью. –

0

Да, это вполне возможно, вот пример из Pro Linq по некто Джозеф Rattz:

using (NorthwindDataContext DB = new NorthwindDataContext()) 
     { 
      string StatesXml = 
       @"<States> 
        <State ID=""OR"" Description=""Oregon"" /> 
        <State ID=""WA"" Description=""Washington"" /> 
        <State ID=""CA"" Description=""California"" /> 
        <State ID=""ID"" Description=""Idaho"" /> 
        <State ID=""MT"" Description=""Montana"" /> 
        <State ID=""NM"" Description=""New Mexico"" /> 
       </States>"; 

      XElement States = XElement.Parse(StatesXml); 

      var Custs = (from c in DB.Customers 
         where c.Country == "USA" 
         select c).AsEnumerable().Join(
         States.Elements("State"), 
         c => c.Region, 
         s => (string)s.Attribute("ID"), 
         (c, s) => new 
         { 
          Customer = c, 
          State = (string)s.Attribute("Description") 
         }); 

      foreach (var Cust in Custs) 
      { 
       Console.WriteLine("Customer = {0} : {1} : {2}", 
        Cust.Customer.CompanyName, 
        Cust.Customer.Region, 
        Cust.State); 
      } 

А вот что это выведет:

Great Lakes Food Market: OR: Oregon

Hungry Coyote Import Store: OR: Oregon

Ленивый K Kountry Store: WA: Вашингтон

Давайте прекратим N Магазин: CA: California

Lonesome Pine Ресторан: OR: Oregon

гремучая Каньон Бакалея: NM: Нью-Мексико

Save-A-Lot рынки: ID: Айдахо

The Big Cheese: OR: Oregon

взломщик Box: MT: Montana

Trail'S Глава Gourmet Provisioners: Вашингтон: Вашингтон

Белый клевер рынки: Вашингтон: Вашингтон