2009-07-14 6 views
1

Das einzige, was ich im Umgang mit Master/Detail und LINQ finden kann, ist durch Datenbindung. Ich verwende jedoch LINQ, um meine Daten abzufragen, und muss die Ergebnisse manuell durchlaufen, ohne dass eine Datenbindung erforderlich ist. Meine letzte Absicht ist es, eine Master-Ergebnismenge zu durchlaufen, eine gruppierte Liste von Kindern zu erhalten und die Master-/Detaildaten als hierarchische Struktur in XML auszugeben.LINQ To SQL - Was ist der effizienteste Weg, um Master/Detail zu durchlaufen?

Meine Illustration: Ich habe eine Tabelle namens my_master_tbl und und es wird nach einem Datum abgefragt werden. Ich habe eine Kind-Tabelle namens my_child_tbl, die nach Datum, nach der Master-ID und Summe() gruppiert wird, um einige Felder zusammenzufassen. Ich möchte die gruppierten Daten mit dem Master verknüpfen und den Master/Detail auf die effizienteste Weise durchlaufen, um die Ergebnisse als XML zu exportieren. Was ist so? Der einzige Weg, den ich mir vorstellen kann, besteht darin, den Master zu durchlaufen und dann die gruppierte Ergebnismenge der Kinder basierend auf master_id abzufragen.

Antwort

0

Ich würde implementieren diese eine Kombination aus LinqToSql und LinqToXml verwenden, ähnlich der folgenden:

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)) 
           ) 
          ))); 

Hier einige resultierende Xml dies generieren:

<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> 

Ich bin sicher, dass du‘ Ich werde einige Änderungen daran vornehmen müssen, basierend auf dem Layout, das Sie verwenden wollten, aber hoffentlich wird es Ihnen einige Ideen geben.

Dies setzt auch voraus, dass Ihre Beziehungen zwischen Ihren Master- und Child-Tabellen eingerichtet sind. Wenn dies nicht der Fall ist, sind einige weitere Änderungen erforderlich.

1

Ich empfehle dies entweder als eine gespeicherte Prozedur, die zu Resultsets oder als eine Abfrage, die alle Stammdaten und eine andere Abfrage erhält, die alle untergeordneten Daten erhält. Auf diese Weise haben Sie es zur Hand. Wenn Sie die Stammdaten durchlaufen, haben Sie bereits ALLE Kinddaten zur Hand. Sie können dann einen serverseitigen Filter für alle untergeordneten Daten durch die aktuelle Master-ID ausführen und alle untergeordneten Daten durchlaufen.

Dieses Konzept würde auch für Paging funktionieren, wenn Sie dies jemals tun müssen, da Sie nur die Menge Master- und Kinddaten erhalten, mit denen Sie in einer bestimmten Iteration arbeiten müssen.