Выберите дерево категорий в Entity Framework - PullRequest
3 голосов
/ 13 января 2011

У меня есть таблица категорий с древовидной структурой (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 ]

1 голос
/ 13 января 2011

Это рекурсивный / высокотехнологичный запрос с табличным выражением. EF не обеспечивает поддержку таких запросов. Если вы хотите получать данные за один проход в БД, вы должны обернуть их в хранимую процедуру и импортировать эту процедуру в модель вашей сущности.

Пейджинг в SQL также возможен при использовании табличных выражений и ROW_NUMBER ().

0 голосов
/ 31 мая 2012

есть идея. я не проверял это, так что не вините, если это не работает: 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...