3

Id、CategoryName、および ParentId を持つ自己参照テーブルがあります。それ自体がカテゴリに分割できるカテゴリの階層テーブルの典型的なシナリオであり、DB の専門家は隣接モデルと呼ばれていると言っています。

私が望むのは、Linq to SQL を使用して、それ自体が他のサブカテゴリに関連していないサブカテゴリをクエリすることです。つまり、特定のカテゴリまたはサブカテゴリの直接のリーフ ノードです。

簡単な部分は、サブカテゴリを取得することです。ここにコードを入れるのはほとんど恥ずかしいです。しかし、私たちはコードを見るのが好きです..

IList<Categories> subcategories = context.Where( c => c.ParentId == 1).ToList();  

しかし、サブカテゴリのないカテゴリに絞り込むことで、私は好転します。どんな助けでも大歓迎です。

助けてくれてありがとう。ジェフ

更新**これは機能しているように見えますが、誰かがそれが「適切」であることを確認できれば幸いです。したがって、Id = 1 のカテゴリの下にリーフ ノードが必要な場合は、次のようにします。

Categories.Where( c => !c.Children.Any ( d => d.ParentId == c.Id)).Where( e => e.ParentId == 1) 

"Children" は、Linq が自己参照関連に付けた名前です。

4

2 に答える 2

2

Any()メソッドはSQL "EXISTS()"関数に!c.Children.Any ( d => d.ParentId == c.Id))変換され、次のようなSQL句に変換されるため、ソリューションは正しいですNOT EXISTS (SELECT * FROM Categories WHERE ParentID = outerRef.ID)

それを行う別の方法は、次を使用することCountです。

Categories.Where( c => c.Children.Count(d => d.ParentId == c.Id) == 0).Where( e => e.ParentId == 1)

ただし、通常、SQL では EXISTS() が COUNT() よりも優先されるため (パフォーマンス上の理由から)、Any() を使用したソリューションが正しいはずです。

于 2009-01-06T00:58:37.607 に答える
0

あなたの質問を正しく理解していれば、自分の子を持たないすべての子要素を取得しようとしていると思います...このクエリは、ノードが親として使用されているかどうかをテストするために、テーブル自体を結合します。そうではなく、結果に表示されます。

テストするものが何もないので、これが機能するかどうかはわかりません...

   (from c in context
    join cc in context on c.id equals cc.parentid into temp
    from t in temp.DefaultIfEmpty()
    where t == null
    select c).ToList()
于 2009-01-06T00:56:57.720 に答える