Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算平均值时是否可以使用Skip和Take?_C#_Entity Framework_Linq - Fatal编程技术网

C# 计算平均值时是否可以使用Skip和Take?

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

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

查询如下:

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,这就是为什么要求提供版本并对照它进行检查的原因。总而言之,这个问题对我来说是不可复制的——它不应该发生,修复也不应该修复它:祝你好运。