2011-01-13 6 views
3

ツリー構造(Id、MasterId)を持つカテゴリテーブルがあります カテゴリとすべての子カテゴリに属する​​すべての製品を選択したいと考えています。Entity Frameworkのカテゴリツリーを選択してください

今日私は動作するこのSQLクエリを使用しますが、ページネーションを追加したいのですが、それは純粋なLINQクエリで簡単になります。私は、Entity Frameworkは、ページネーションでこれに素敵なLINQクエリを取得する方法任意のアイデア(現在のページ、ページあたりの製品数、総生産数)4.

@Count int = 100, 
@CategoryId int 

with mq as 
(
    select c.Id as parent, c.Id as child 
    from dbo.Categories c 
    where c.Id = @CategoryId 
    union all 
    select q.child, c.Id 
    from mq q 
    inner join dbo.Categories c on q.child = c.MasterId 
) 

select top (@Count) P.* from Products P 
inner join ProductToCategory PC ON(PC.ProductId = P.Id) 
where PC.CategoryId in (
    select child from mq 
) 
and P.PublishStatus = 1 
order by P.PublishedDate DESC; 

でしょうか?

答えて

1

これは、テーブル式を使用した再帰的/検索的なクエリです。 EFはそのようなクエリをサポートしていません。 DBへの1回のラウンドトリップでデータを受信する場合は、ストアドプロシージャでラップし、そのプロシージャをエンティティフレームワークモデルにインポートする必要があります。アイデアがあるtable expressions and ROW_NUMBER().

+0

式でこれを達成する方法はありますか? [this](http://stackoverflow.com/a/15636530/75500)のようなもの? – Shimmy

0

を使用した場合、SQLで

ページングも可能です。私はそれをテストしていないので、それが動作しない場合、責任を負いません:P

var ids = context.TreeItems.Where(x => x.Id == parentId).Select(x => (int?)x.Id); 

    var tmp = ids; 
    while (true) 
    { 
     IQueryable<int?> localIds = tmp; 
     var subIds = context.TreeItems.Where(x => ids.Contains(x.ParentId)).Select(x => (int?)x.Id); 
    if (subIds.Any()) 
    { 
     tmp = subIds; 
     ids = ids.Union(subIds); 
      } 
    else 
     break; 
} 

    var allSubItems = context.TreeItems.Where(x => ids.Contains(x.Id)); 
+0

これは、サーバーへの複数回のラウンドトリップが必要になります。 – Shimmy

関連する問題