C# 计算平均值时是否可以使用Skip和Take?
我正在尝试使用LINQ to实体创建查询,该实体计算产品的平均评级。在订购评级之前,我将每个产品的平均值投影到一个匿名对象上。然后我只想得到部分结果 查询如下:C# 计算平均值时是否可以使用Skip和Take?,c#,entity-framework,linq,C#,Entity Framework,Linq,我正在尝试使用LINQ to实体创建查询,该实体计算产品的平均评级。在订购评级之前,我将每个产品的平均值投影到一个匿名对象上。然后我只想得到部分结果 查询如下: var query = Items.GroupBy(review => review.Product) .Select(group => new { Product = group.Key, Rating = gr
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();
生成的查询如下所示:
{选择
1作为[C1],
[GroupBy1][K1]作为[ProductId],
[GroupBy1][K2]作为[TotalImages],
[GroupBy1][K3]作为[TotalVideos],
[GroupBy1][K4]作为[TotalAudioRecordings],
[GroupBy1].[K5]作为[Name],
[GroupBy1][K6]作为[DiscountedPrice],
[GroupBy1][K7]作为[Status],
[GroupBy1][A1]作为[C2]
从选择
[Extent2][ProductId]作为[K1],
[Extent2][TotalImages]作为[K2],
[Extent2][TotalVideos]作为[K3],
[Extent2][TotalAudioRecordings]作为[K4],
[Extent2]。[Name]作为[K5],
[extend2][DiscountedPrice]作为[K6],
[Extent2]。[Status]作为[K7],
平均值[Extent1]。[Rating]为[A1]
来自[dbo]。[ProductReviews]作为[Extent1]
左外部联接[dbo].[Products]为[Extent1].[Product\u ProductId]=[Extent2].[ProductId]上的[Extent2]
按[Extent2].[ProductId]、[Extent2].[TotalImages]、[Extent2].[TotalVideos]、[Extent2].[TotalAudioRecordings]、[Extent2].[Name]、[Extent2].[DiscountedPrice]、[Extent2].[Status]分组
AS[GroupBy1]}
查询不能跳过任何项目,也不能只获取少数结果。而是返回数据库中每个产品的平均值的计算结果
是否可以像我试图做的那样使用Skip and Take?如果是,如何更正查询以获得所需的结果?最好不要从数据库中提取所有数据 我认为您可能需要在查询中再添加一个select:
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();
我不确定这将如何实际执行,但初始测试看起来不错。你能解释一下第二次选择背后的基本原理吗?查询应该按照它的编写方式进行。你用的是什么EF版本?@IvanStoev EF 6.1.3。然后它就这样为我工作。我的测试数据中有50种产品,每种产品有50个评级。当我将itemsToSkip的值传递到0,计数为10时,它将返回所有50个产品。当我修改代码以包含一个额外的select(根据目前发布的唯一答案),代码返回了10个产品。我的观点是,在我的测试环境中,生成的查询始终包含ORDER BY和TOP或OFFSET FETCH子句。包括额外的select没有任何意义,听到@CodingYoshi如何实现这一绝妙的想法会很有趣-当你做这些事情时,通常意味着要解决第三方的bug,这就是为什么要求提供版本并对照它进行检查的原因。总而言之,这个问题对我来说是不可复制的——它不应该发生,修复也不应该修复它:祝你好运。