【问题标题】:Is it possible to use Skip and Take whilst calculating an Average?在计算平均值时是否可以使用 Skip 和 Take?
【发布时间】:2017-02-12 16:11:12
【问题描述】:

我正在尝试使用 LINQ to Entities 创建查询,以计算产品的平均评分。在订购评级之前,我将每个产品的平均值投影到一个匿名对象。然后,我只想获取一部分结果。

查询如下:

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?如果是这样,我如何更正查询以获得所需的结果?最好不要从数据库中提取所有数据。

【问题讨论】:

  • 查询应该按照它的编写方式工作。您使用的是哪个 EF 版本?
  • @IvanStoev EF 6.1.3.
  • 那么它就对我有用。
  • 我的测试数据中有 50 个产品,每个产品有 50 个评分。当我为 itemsToSkip 传递 0 并且计数为 10 时,它将返回所有 50 个产品。当我根据迄今为止发布的唯一答案更改我的代码以包含一个额外的选择时,代码返回了 10 个产品。
  • 我的意思是,在我的测试环境中,生成的查询总是包含ORDER BYTOPOFFSET FETCH 子句。包括额外的选择没有任何意义,听听@CodingYoshi 如何获得那个“绝妙”的想法会很有趣——当你做这样的事情时,它通常意味着解决第 3 方错误,这就是为什么要求版本并检查它.回顾一下,这个问题对我来说是不可重现的——它不应该发生,“修复”也不应该修复它:)祝你好运。

标签: c# entity-framework linq


【解决方案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();

【讨论】:

  • 我不确定这将如何实际执行,但初始测试看起来不错。你能解释一下第二次选择背后的理由吗?
猜你喜欢
  • 2020-04-17
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多