2009-07-14 11 views
1

マスター/ディテールとLINQを扱うときに私が見つけることができるのは、データバインディングだけです。しかし、LINQを使用してデータを照会しており、データバインディングを必要とせずに結果を手動でループする必要があります。私の最終的な目的は、マスター結果セットをループし、グループ化された子のリストを取得し、マスター/ディテール・データをXMLのヒエチャリ構造として出力することです。LINQ To SQL - マスター/ディテールをループする最も効率的な方法は何ですか?

私のイラスト:私はmy_master_tblというテーブルを持っていて、それは日付によって照会されます。 my_child_tblという名前の子テーブルがあります。これは、日付、マスターID、およびいくつかのフィールドを合計するためにsum()を使用してグループ化されます。グループ化されたデータをマスタにリンクし、マスター/ディテールをループして、結果をXMLとしてエクスポートできる最も効率的な方法でループしたいと思います。その方法は何ですか?私が考えることができる唯一の方法は、マスターをループし、master_idに基づいて子のグループ化された結果セットを照会することです。

答えて

0

私は、次のようにLinqToSqlとLinqToXmlの組み合わせを使用して、これを実装します:これは、生成されます。ここ

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

は、いくつかの結果のXMLです:

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

を、私はあなたが」確信していますあなたが使用しようとしていたレイアウトに基づいてこれを少し変更する必要がありますが、うまくいけばそれはあなたにいくつかのアイデアを与えるでしょう。

これはまた、マスターテーブルと子テーブルの間の関係が設定されていることを前提としています。そうでない場合は、いくつかの変更が必要です。

1

これは、結果セットに戻るストアドプロシージャとして、またはすべてのマスタデータを取得するクエリと、すべての子データを取得する別のクエリとして行うことをお勧めします。あなたが手に持っているこの方法で。次に、マスターデータを繰り返し処理する際に、すでにすべての子データがあります。次に、すべての子データに対して現在のマスターIDでサーバー側フィルタを実行し、すべての子データを反復処理できます。

このコンセプトは、指定された繰り返しで作業する必要のある量のマスターデータと子データしか得られないため、これを行う必要がある場合にもページングに使用できます。

関連する問題