3 votes

Sélectionner l'arbre des catégories dans Entity Framework

J'ai une table Catégorie avec une structure arborescente (Id,MasterId) Je voudrais sélectionner tous les produits qui appartiennent à une catégorie et à toutes les catégories enfant.

Aujourd'hui, j'utilise cette requête SQL qui fonctionne, mais j'aimerais ajouter la pagination et cela serait plus facile avec une pure requête LINQ. J'utilise 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;

Avez-vous une idée de la façon d'obtenir une requête LINQ avec pagination (page actuelle, nombre de produits par page, nombre total de produits) ?

1voto

Ladislav Mrnka Points 218632

Il s'agit d'une requête récursive / hiéarchique avec expression de table. EF ne supporte pas de telles requêtes. Si vous voulez recevoir des données en un seul aller-retour vers la base de données, vous devez les envelopper dans une procédure stockée et importer cette procédure dans votre modèle entity framework.

La pagination en SQL est également possible en utilisant expressions de table et ROW_NUMBER().

0voto

maxlego Points 1945

Il y a une idée. Je ne l'ai pas testée, donc ne me blâmez pas si elle ne fonctionne pas :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));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X