3

オブジェクトのネストされた階層から選択するための最良の方法は何ですか?MyRecursiveObject以下のようなクラスがあると仮定します。

 public class MyRecursiveObject
 {
   public Int64 Id { get; set; }
   public MyRecursiveObject Parent { get; set; }
 }

MyRecursiveObjectのインスタンスのすべての親IDを選択しながら、最大のパフォーマンスを達成するにはどうすればよいですか?

どんな提案でも大歓迎です。

4

2 に答える 2

1

再帰の代わりに単純なループを使用できます。

public IEnumerable<long> GetAllParentIdsOf(MyRecursiveObject obj)
{
    MyRecursiveObject child = obj;

   while (child.Parent != null)
   {
       child = child.Parent;
       yield return child.Id;
   }
}

サンプル:

MyRecursiveObject obj = new MyRecursiveObject {    
    Id = 1,
    Parent = new MyRecursiveObject {
        Id = 2,
        Parent = new MyRecursiveObject { Id = 3 }
    }
};

GetAllParentIdsOf(obj).ToList().ForEach(Console.WriteLine);

// 2
// 3
于 2013-03-04T15:59:05.170 に答える
1

LinqToSqlは、任意の深さの木を歩くことをサポートしていません。結果を生成するには、TSQL Whileループを使用してSQL関数を記述し、そのsql関数をlinqtosqlから呼び出す必要があります。

何かのようなもの:

DECLARE @MyNodeID int
SET @MyNodeID = 42
  -- we're looking for the path from this ID back up to the root
  -- we don't know the length of the path.

DECLARE @MyTable TABLE
(
  int ID PRIMARY KEY,
  int ParentID,
)

DECLARE @ID int
DECLARE @ParentID int

SELECT @ID = ID, @ParentId = ParentId
FROM MyRecursiveObject
WHERE ID = @MyNodeID

WHILE @ID is not null
BEGIN

  INSERT INTO @MyTable (ID, ParentID) SELECT @ID, @ParentID

  SET @ID = null

  SELECT @ID = ID, @ParentId = ParentID
  FROM MyRecursiveObject
  WHERE ID = @ParentID

END

SELECT ID, ParentID FROM @MyTable  --results
于 2013-03-04T16:18:39.313 に答える