1

MenuItem に次のクラスが定義されています

public class MenuItem
{
    public int Id { get; set; }
    public string Key { get; set; }     
    public int ParentId { get; set; }
    public string Url { get; set; }        
}

また、以下はすべてのメニュー項目のコレクションです

List<MenuItem> allMenu=new List<MenuItem>
  {new MenuItem{Id=1,Key="Level1-A",Url="url1"},
  {new MenuItem{Id=2,Key="Level1-B",Url="url2"},
  {new MenuItem{Id=3,Key="Level2-A",Url="url3", ParentId=1},
  {new MenuItem{Id=4,Key="Level3-AA",Url="url1", ParentId=3}};

これで、DB から取得したメニュー項目は 1 つだけになりました。Level3-AA

MenuItem item=new MenuItem{Id=4,Key="Level3-AA",Url="url1", ParentId=3};

 allMenu.FindAll(m=>m.Id==item.Id) //gives only one element Level3-AA

//しかし、すべての親 ID menuitem も含める必要があります。

この場合Level2-ALevel1-A

これをC#に含めるにはどうすればよいですか? LINQ または任意の拡張メソッドの使用を歓迎します

4

2 に答える 2

2
List<MenuItem> all = new List<MenuItem>();
all.Add(item);

while (item.ParentId != 0) // Ideally you should use Nullable<int>
{
    var parent = allMenu.Single(m => m.Id = item.ParentId);
    all.Add(parent);
    item = parent;
}

This will result in multiple queries to the database though. If you don't want this to happen you'll need to write your own SQL query with database features like recursive CTE.

于 2013-08-02T16:19:27.903 に答える