2010-01-13 6 views
1

Est-il possible de combiner Linq-to-SQL et Linq-to-XML si une colonne d'une table est XML?Combinaison de Linq-to-SQL et Linq-to-XML

+0

Que voulez-vous dire par "combiner"? –

+0

Linq à SQxML? :) –

+0

Je veux dire faire une requête sql en utilisant xpath avec linq to sql en utilisant linq to xml dedans. –

Répondre

3

Si par "combiner" vous voulez dire « avoir LINQ to SQL traduire la requête dans une réelle Requête SQL Server XML "alors je crois que la réponse est non. Mais rien ne vous empêche de retirer les données XML et d'exécuter une requête XML locale.

Pour répondre à la question plus générale de "comment travailler avec une colonne XML dans ce scénario", la meilleure approche serait de créer une fonction définie par l'utilisateur pour gérer le XML, si vous le pouvez. Ensuite, vous pouvez obtenir Linq to SQL pour exécuter le fichier UDF. A défaut, je suivrai la procédure de procédure stockée.

+0

En effet, mais ensuite je reçois un débordement de mémoire car de nombreux enregistrements sont renvoyés. –

+0

Ouch. Voir mon édition - j'espère qu'un UDF ou SP peut travailler pour vous ici. – Aaronaught

+0

En effet, une procédure stockée serait ma prochaine pensée. –

0

Oui, il est très possible ici est un exemple de Linq Pro par Joeseph 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); 
      } 

Et voici ce qui génèrerait:

Grands Lacs Marché alimentaire: OR: Oregon

Hungry Coyote Importateur Magasin: OU: Oregon

Lazy K Kountry Succursale: WA: Washington

Let Stop N Shop: CA: Californie

Lonesome Pine Restaurant: OR: Oregon

Rattlesnake Canyon épicerie: Nouveau-Mexique: Nouveau-Mexique

Save-a-lot Marchés: ID: Idaho

The Big Cheese: OR: Oregon

Le Cracker Box: MT: Montana

Trail de Chef Gourmet Provisioners: WA: Washington

Trèfle blanc Marchés: WA: Washington