2012-02-14 7 views
0

私はネストセットモデルを使用しており、10個の親アイテムと各親用の10個の子供アイテムを注文できるようにしたいと考えています。Linqは各親アイテムに対して10個の子供を選択します

私はネストされたコメントシステムを作成しようとしています。コメントシステムへの返信は、その「親」コメント内に左右の値を持つことによって示されます。

大きなリストのリストの読み込み時間を短縮して、1つのLinq文で上記のことができたら、繰り返し呼び出しを行うよりも多くの時間を節約できると思います各親のために10人の子供を得るためのdb。

私はこの文を使用して、datacontextから親(またはルート項目)を取得します。

var query = context.Items 
        .Where(x => !context.Items.Any(y => y.LeftPos < x.LeftPos 
                && y.RightPos > x.RightPos)) 
        .OrderBy(x => x.Id) 
        .Take(pageSize) 
        .ToList(); 

上記のコードは、彼らの外部左右の値を有する任意の他の項目がないチェックすることにより、ネストされたセットモデルにおいて、最も外側の(親)の項目を取得しています。

したがって、foreach(私は現在行っている)でループするのではなく、各反復でdbに10または(pageSize)を呼び出すのではなく、各親ノードの10人の子供をLinqステートメント?

編集:

私はネストセットモデルを使用しています。私のアイテムは左右のポジションを持っています(leftPosとrightPos)。だから、子供は別のオブジェクトの左と右の値の中に左と右の値を持つオブジェクトであり、それは今度は親になります。私はアイテム

1 a 4 
2 b 3 
5 c 10 
6 d 7 
8 e 9 
11 f 14 
12 g 13 

多くの....

を持っている場合

1 a 4 
    2 b 3 

ので、私はLINQのを使用して、それぞれの親から子どもたちのx量を選択することができます方法はありますか?

すべてのヘルプは

+4

複数の行に配置すると、目障りになることはありません... –

+1

正直ではありません。 ..あなた自身が今自分で編集しています - あなたの考えを見てください... –

+1

さて、コードはより明確になりました。あなたのモデルについてもっと詳しく説明できますか?親子関係が何であるかは私には分かりません。 –

答えて

2
class Program 
    { 
     static void Main(string[] args) 
     { 
      List<A> lst = new List<A>(); 

      for (int j = 1; j < 4; j++) 
      { 
       var tmp = new A() { Value = j * 1000 }; 
       for (int i = 0; i < 150; i++) 
       { 
        tmp.SubItems.Add(new B { Value = i + 1, Parent = tmp }); 
       } 
       lst.Add(tmp); 
      } 

      List<B> result = lst.SelectMany(x => x.SubItems.Take(10)).ToList(); 
     } 
    } 

    public class A 
    { 
     public A() 
     { 
      SubItems = new List<B>(); 
     } 

     public int Value { get; set; } 
     public List<B> SubItems { get; set; } 
    } 


    public class B 
    { 
     public int Value { get; set; } 
     public A Parent { get; set; } 
    } 

ない、これはあなたが望むものであるかどうかわからを高く評価しました。このようにして、サブアイテムの集合を得ることができます。各親の10のサブアイテム。各サブアイテムの.Parentプロパティを持つ親にアクセスすることができます。

+1

私はループしません!サンプルデータを作成するためにループします。 lst.SelectMany(x => x.SubItems.Take(10))は、唯一のlinq呼び出しです。 – Jaster

関連する問題