0

何度も複製します(およびこれらも)

次の列を持つタイプというテーブルがあります。

ID レベル名 ParentID (親行の ID)

次の列を持つ ParentObject というテーブル。ID タイプ ID

4 つの異なるレベルがあります (さらに拡張される可能性があります)。

もし私が持っていたら

ID: 1 レベル: 0 名前: Level0 ParentID: null

ID: 2 レベル: 1 名前: Level1 ParentID: 1

ID: 3 レベル: 2 名前: Level2 ParentID: 2

ID: 4 レベル: 3 名前: Level3 ParentID: 3

ID: 5 レベル: 4 名前: Level4 ParentID: 4

ParentObject テーブルには、最下位レベルの ID を格納するだけでツリーを格納します。したがって、私が持っている ID が 4 の場合、ツリーが実際に Level0 -> Level1 -> Level2 -> Level3 になることがわかります。

基本的に、linq ステートメントなどで特定のタイプ、またはタイプ レベル 2 のすべてのオブジェクトを検索できる必要があります。

ParentObject テーブルに格納されている TypeID が 4 であるため、Level3 とします。

しかし、実際には、レベル 2 型の ID が 3 であるすべての ParentObject を検索したいと考えています。

格納されている ID はレベル 1 またはレベル 2 などである可能性があるため、これを行う最善の方法は何でしょうか?

可能であれば、できれば 1 つの linq ステートメントで。

4

1 に答える 1

0

SQL (MS SQL Server 2005 以降) では、共通テーブル式を使用して再帰を実装できます。LINQ は CTE をサポートしていません。いくつかの回避策は、ストアド プロシージャを作成し、それをメソッドとしてデータ コンテキストにマップすることです。

もう 1 つの解決策は、SQL を C# コードに直接記述し、LINQ で実行することです。これを参照してください。

または、親 ID がなくなるまでデータから選択する C# コードを少し書くこともできます。大まかな例は...

public partial class Form1 : Form
{
    public Form1()
    {
         IList<Data> data = new List<Data>();

        data.Add(new Data() { ID = 1, ParentID = 0, SomeData = "Example" });
        data.Add(new Data() { ID = 2, ParentID = 1, SomeData = "Another Example" });
        data.Add(new Data() { ID = 3, ParentID = 2, SomeData = "Example three" });
        data.Add(new Data() { ID = 4, ParentID = 3, SomeData = "Last example" });

        IList<Data> results = new List<Data>();

        Int32 parentID = 2;

        while (parentID > -1)
        {
            results.Add(
                data.Where(x => x.ParentID == parentID).Single()
            );

            parentID--;
        }
    }
}

public class Data
{
    public Int32 ID { get; set; }
    public Int32 ParentID { get; set; }
    public String SomeData { get; set; }
}

お役に立てれば!

于 2009-10-12T20:06:08.937 に答える