5

parentid値またはnullを持つデータベースからのアイテムのコレクションがあります。

これが私のクラスの設計です:

public class Item
{
public int id{get;set;}
public string Name{get;set;}
public int? ParentId{get;set;}
public List<Item> SubItems{get;set;}
}

コレクションからアイテムの階層構造を構築したい。コレクションは、ParentId マッピングに基づいて構造を構築する必要がある 100 個のアイテムであると仮定します。

C# と LINQ でこの投稿 Recursive Hierarchical Joins を試し ましたが、ParentId が null の場合はエラーが発生します。

親子関係を再帰的にチェックしてツリー型リストを構築するC#も試しましたが、この解決策もうまくいきません。

どうすればこれを達成できますか?

4

3 に答える 3

7

このアプローチを使用できます。

  1. データベースからすべての項目を取得します (SubItem を埋めずに)。
  2. Lookup<int?,Item>親 ID とその親 ID を持つアイテムの を構築します。
  3. アイテムをループし、ルックアップを使用して各アイテムをサブアイテムに関連付けます。

コード:

var items = // get from the database... (e.g. as a list)
var lookup = items.ToLookup(x => x.ParentId);
foreach (var item in items)
    item.SubItems = lookup[item.Id].ToList();

@EamonNerbonneが以下にコメントしたように、必要に応じてルート要素も取得できます

var roots = lookup[null].ToList();
于 2013-08-03T07:05:11.080 に答える
0

サブアイテムのセッターが本当に必要ですか?また、SQL サーバーでSelect*クエリを実行するときのパフォーマンスの問題にも注意してください。

  public List<Item> SubItems{
  get
  {
   try{
        var validParents = db.items.Where(x=>x.ParentId!=null && x.ParentId.Equals(Id)); //db is your dbcontext
        if(validParents !=null)
        {
           return validParents.ToList(); 
        }else
        {
         return null;
        } 
        catch(Exception)
        {
          return null;
        }
   }

(注: これを部分エンティティ クラスに追加することを検討してください。エンティティに「Item」という名前を付けないでください :)Item は予約語です。)

于 2013-08-03T07:31:46.977 に答える