2017-02-12 3 views
3

製品の評価の平均を計算するLINQ to Entitiesを使用してクエリを作成しようとしています。評価を注文する前に、各製品の平均を匿名オブジェクトに投影します。私はその後、結果の一部だけを取りたいと思っています。Skip and Takeを使用して平均を計算することはできますか?

クエリは以下の通りです:

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(); 

次のようになり、生成されるクエリ:クエリは任意の項目をスキップする動作しない、またはほんの数を取るために

{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]} 

を結果。むしろ、データベース内のすべての製品の平均の計算を返します。

私がしようとしているようにSkipTakeを利用することはできますか?もしそうなら、希望の結果を得るためにクエリを修正するには?私はデータベースからすべてのデータを取り戻さないことが望ましいです。

+0

クエリは、それが書かれているように動作しなければなりません。どのEFバージョンを使用していますか? –

+0

@IvanStoev EF 6.1.3。 –

+0

それはそれが私のために働く。 –

答えて

1

は、私はあなたのクエリに1以上の選択追加する必要があるかもしれないと思う:

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(); 
+0

これは実際にどのように実際には実行されるのかはわかりませんが、最初のテストはうまくいきます。おそらく2番目の選択の背後にある論理的根拠を説明できますか? –

+0

モデルのコードを投稿してください。 – CodingYoshi

関連する問題