2009-07-14 13 views
1

La seule chose que je peux trouver en traitant master/detail et LINQ est à travers la liaison de données. Cependant, j'utilise LINQ pour interroger mes données et je vais devoir parcourir manuellement les résultats sans nécessiter de liaison de données. Mon but final est de faire une boucle dans un ensemble de résultats maître, d'obtenir une liste groupée d'enfants et de générer les données principales/détaillées en tant que structure hiérarchique dans XML.LINQ To SQL - Quel est le moyen le plus efficace de passer en revue le maître/détail?

Mon illustration: J'ai une table appelée my_master_tbl et elle sera interrogée par une date. J'ai une table enfant appelée my_child_tbl qui sera groupée par date, par l'identifiant principal, et utilise sum() pour totaliser certains champs. Je voudrais lier les données groupées au maître et faire une boucle dans le maître/détail de la façon la plus efficace possible pour exporter les résultats en XML. Qu'est-ce que c'est? La seule façon que je peux penser est de faire une boucle dans le maître, puis interroger le jeu de résultats groupés des enfants en fonction de master_id.

Répondre

0

Je mettre en œuvre cette aide d'une combinaison de LinqToSql et LinqToXml, semblable au suivant:

var query = new XDocument(
    new XElement("Results", from i in context.my_master_tbl 
          where i.ItemDate > DateTime.Now.AddDays(-7) 
          select new XElement("MasterItem", 
           new XAttribute("MasterName", i.Name), 
           from c in i.my_child_tbl 
           group c by c.Date into g 
           select new XElement("Child", 
            new XAttribute("Date", g.Key), 
            new XAttribute("SumField", g.Sum(d => d.FieldToSum)) 
           ) 
          ))); 

Voici quelques-uns Xml résultant cela va générer:

<Results> 
<MasterItem MasterName="A"> 
    <Child Date="2009-01-15T00:00:00-06:00" SumField="491470" /> 
</MasterItem> 
<MasterItem MasterName="B"> 
    <Child Date="2009-01-29T00:00:00-06:00" SumField="491526" /> 
</MasterItem> 
<MasterItem MasterName="C"> 
    <Child Date="2009-01-15T00:00:00-06:00" SumField="1965960" /> 
    <Child Date="2009-07-14T00:00:00-05:00" SumField="-27" /> 
</MasterItem> 
<MasterItem MasterName="D" /> 
<MasterItem MasterName="E" /> 
</Results> 

Je suis sûr que vous Je vais devoir faire quelques changements en fonction de la mise en page que vous prévoyez utiliser, mais j'espère que cela vous donnera quelques idées.

Cela suppose également que vos relations sont configurées entre vos tables maître et enfant. Si ce n'est pas le cas, quelques autres changements seront nécessaires.

1

Je suggère de le faire soit comme une procédure stockée qui retourne à des ensembles de résultats ou comme une requête qui obtient toutes les données de base et une autre requête qui obtient toutes les données enfants. De cette façon, vous l'avez en main. Ensuite, lorsque vous parcourez les données de base, vous disposez déjà de TOUTES les données enfant. Vous pouvez ensuite faire un filtre côté serveur sur toutes les données enfants par l'ID principal actuel ... et parcourir toutes les données enfants.

Ce concept fonctionnerait également pour la pagination si vous en aviez besoin, car vous ne disposez que du nombre de données maître et enfant avec lequel vous devez travailler dans une itération donnée.