在Entity Framework中选择类别树

时间:2011-01-13 11:34:28

标签: c# linq entity-framework

我有一个带有树结构的Category表(Id,MasterId) 我想选择属于某个类别和所有子类别的所有产品。

今天我使用这个有效的SQL查询,但我想添加分页,使用纯LINQ查询会更容易。我使用Entity Framework 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;

如何通过分页(当前页面,每页产品数量,总产品数量)获得一个漂亮的LINQ查询?

2 个答案:

答案 0 :(得分:1)

这是带表表达式的递归/层次查询。 EF不提供此类查询的支持。如果要通过单向往返DB接收数据,则必须将其包装在存储过程中并将该过程导入实体框架模型。

使用table expressions and ROW_NUMBER().

时,也可​​以在SQL中进行分页

答案 1 :(得分:0)

有一个想法。我没有测试过,所以如果它不起作用就不要责怪: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));