3 votes

Est-il possible d'utiliser la fonction "Skip and Take" lors du calcul d'une moyenne ?

J'essaie de créer une requête utilisant LINQ to Entities qui calcule la moyenne d'une évaluation pour un produit. Je projette la moyenne pour chaque produit dans un objet anonyme, avant de classer les évaluations. Je veux ensuite prendre seulement une partie des résultats.

La requête est ci-dessous :

var query = Items.GroupBy(review => review.Product)
            .Select(group => new
            {
                Product = group.Key,
                Rating = group.Average(review => review.Rating)
            })
            .OrderByDescending(pr => pr.Rating)
            .Skip(itemsToSkip)
            .Take(count)
            .ToList();

La requête qui est générée ressemble à ce qui suit :

{SELECT 
1 AS [C1], 
[GroupBy1].[K1] AS [ProductId], 
[GroupBy1].[K2] AS [TotalImages], 
[GroupBy1].[K3] AS [TotalVideos], 
[GroupBy1].[K4] AS [TotalAudioRecordings], 
[GroupBy1].[K5] AS [Name], 
[GroupBy1].[K6] AS [DiscountedPrice], 
[GroupBy1].[K7] AS [Status], 
[GroupBy1].[A1] AS [C2]
FROM ( SELECT 
    [Extent2].[ProductId] AS [K1], 
    [Extent2].[TotalImages] AS [K2], 
    [Extent2].[TotalVideos] AS [K3], 
    [Extent2].[TotalAudioRecordings] AS [K4], 
    [Extent2].[Name] AS [K5], 
    [Extent2].[DiscountedPrice] AS [K6], 
    [Extent2].[Status] AS [K7], 
    AVG([Extent1].[Rating]) AS [A1]
    FROM  [dbo].[ProductReviews] AS [Extent1]
    LEFT OUTER JOIN [dbo].[Products] AS [Extent2] ON [Extent1].[Product_ProductId] = [Extent2].[ProductId]
    GROUP BY [Extent2].[ProductId], [Extent2].[TotalImages], [Extent2].[TotalVideos], [Extent2].[TotalAudioRecordings], [Extent2].[Name], [Extent2].[DiscountedPrice], [Extent2].[Status]
)  AS [GroupBy1]}

La requête ne fonctionne pas pour sauter des éléments, ou pour ne prendre que quelques résultats. Elle renvoie plutôt un calcul de la moyenne pour chaque produit de la base de données.

Est-il possible d'utiliser Skip y Take comme je tente de le faire ? Si oui, comment puis-je corriger la requête pour obtenir le résultat souhaité ? Il est souhaitable que je ne récupère pas toutes les données de la base de données.

1voto

CodingYoshi Points 17416

Je pense que vous devez ajouter une sélection supplémentaire à votre requête :

var query = Items.GroupBy(review => review.Product)
.Select(group => new
{
    Product = group.Key,
    Rating = group.Average(review => review.Rating)
})
.OrderByDescending(pr => pr.Rating)
.Select(x => new { Product = x.Product, Rating = x.Rating })
.Skip(itemsToSkip)
.Take(count)
.ToList();

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