2

以下のようなツリーで、各項目がその親 ID と順序番号だけを知っている場合、Foo のすべての子孫を照会するにはどうすればよいでしょうか?

  • 1: ふー
    • 2: 子供
      • 3:孫1
      • 4:孫2
  • 5: バー
  • 6: バズ

こんな子が出来ます

var q = from item in foos
        where item.parentid == "Foo"
        select item;

しかし、単一のクエリですべての子孫を任意の深さまで取得するにはどうすればよいでしょうか? 可能であれば、複数のクエリで再帰を避けたいです。具体的には、子と孫だけでなく、n 番目のレベルの子も含めて、可能なすべてのレベルの子孫を取得したいと考えています。この場合のような注文番号を次のようなクエリで使用できると考えました

var q = from item in foos
        where item.ordernumber > 1 && item.ordernumber < 5
        select item;

しかし、この場合5、次の非子孫順序番号を意味する を取得する方法がわかりませんでした。は常にこの1時点で認識されます。


編集:子供と孫だけでなく、すべての子孫を選択するようにしたいという忘れられた詳細を追加しました。

4

2 に答える 2

0
public class Element
    {
        public int ID { set; get; }
        public string Name { get; set; }
        public List<Element> Children { get; set; }
    }

static void Main(string[] args)
        {
            List<Element> elements = new List<Element>();
            Element Foo = new Element() { ID = 1, Name = "Foo" };
            Element Child = new Element() { ID = 2, Name = "Child" };
            Element GrandChild1 = new Element() { ID = 3, Name = "GrandChild 1" };
            Element GrandChild2 = new Element() { ID = 4, Name = "GrandChild 2" };
            Element Bar = new Element() { ID = 5, Name = "Bar" };
            Element Baz = new Element() { ID = 6, Name = "Baz" };
            Foo.Children = new List<Element>();
            Foo.Children.Add(Child);
            Child.Children = new List<Element>();
            Child.Children.Add(GrandChild1);
            Child.Children.Add(GrandChild2);
            elements.Add(Foo);
            elements.Add(Bar);
            elements.Add(Baz);
            var query = elements.Where(e => e.Name == "Foo").SelectMany(c => c.Children);
            var query2 = query.Union(query.SelectMany(g => g.Children));

            foreach (var item in query2)
            {
                Console.WriteLine(item.Name);
            }
        }
于 2013-05-07T20:36:38.513 に答える