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
Entity framework 分组方式和分页(跳过)_Entity Framework_Linq - Fatal编程技术网

Entity framework 分组方式和分页(跳过)

Entity framework 分组方式和分页(跳过),entity-framework,linq,Entity Framework,Linq,我在试着做一些传呼。但是,我需要在一个分组的结果上这样做,因为每次我做一个页面。要求获取给定组的所有数据 以下代码: var erere = dbCtx.StatusViewList .GroupBy(p => p.TurbineNumber) .OrderBy(p => p.FirstOrDefault().TurbineNumber) .Skip(0)

我在试着做一些传呼。但是,我需要在一个分组的结果上这样做,因为每次我做一个页面。要求获取给定组的所有数据

以下代码:

var erere = dbCtx.StatusViewList
                 .GroupBy(p => p.TurbineNumber)
                 .OrderBy(p => p.FirstOrDefault().TurbineNumber)
                 .Skip(0)
                 .Take(10)
                 .ToList();

我有20万个项目,上面的声明似乎太慢了,以至于连接超时。我最好的办法是让它慢下来的是orderby。有什么建议可以这样做,或者如何加速上面的语句吗?

GroupBy需要访问所有元素,将所有
状态视图
分组为具有相同
TurbineNumber的
状态视图

var result = dbCtx.StatusViewList
    .GroupBy(statusView => statusView.TurbineNumber)
    .OrderBy(group => group.Key)
    ...
然后,从每组中选取第一个元素,并要求其涡轮编号,以涡轮编号进行排序

显然,您考虑到一组
StatusViews
可能为空(
FirstOrDefault
,而不是
First
),但再次假设
FirstOrDefault
从不返回null

使用组的
键可以加快查询速度。
是您分组的元素,在您的情况下为
TurbineNumber
:a组中的所有元素都具有相同的
TurbineNumber

var result = dbCtx.StatusViewList
    .GroupBy(statusView => statusView.TurbineNumber)
    .OrderBy(group => group.Key)
    ...
我认为这将是提高绩效的第一步

但是,返回固定数量的组。有些组可能很大,有1000个元素,有些组可能很小:只有一个元素。因此,一个页面的结果可能是10个组,每个组有1000个元素,总共有10000个元素。它也可以是10个组,每个组有1个元素,总共10个元素。我不确定这是否是您希望通过分页得到的结果

如果没有太多相同的
TurbineNumber
,那么您不希望页面中的元素数始终相同,最好使用相同的
TurbineNumber
,用下一个
TurbineNumber
填充页面的其余部分吗。如果使用此
TurbineNumber的
状态视图过多
,请将它们分成几页

比如:

TurbineNumber StatusView
     4            A
     4            B
     4            F
     5            D
     5            K
     6            C
     6            Z
     6            Q
     6            W
     7            E
要执行此操作,请不要使用
GroupBy
,使用
OrderBy
,然后跳过并执行

IEnumerable<StatusView> GetPage(int pageNr, int pageSize)
{
     return dbCtx.StatusViewList
         .Orderby(statusView => statusView.TurbineNumber)
         .Skip(pageNr * pageSize)
         .Take(pageSize)
}

在您的情况下,根本不需要在服务器端进行分组,因为无论如何,您将获得all数据,但在服务器端会有额外的开销。因此,请尝试另一种方法:

var groupPage = dbCtx.StatusViewList.Select(x => TurbineNumber)
                  .Distinct().OrderBy(x => x.TurbineNumber).Skip(40).Take(20).ToList();

var data = dbCtx.StatusViewList.Where(x => groupPage.Contains(x.TurbineNumber))
                  .ToList().GroupBy(x => x.TurbineNumber).ToList();

您是否尝试过
.OrderBy(g=>g.Key))
?另外,您可能应该使用评测来查看generate SQL查询的外观。我分析了问题中陈述的解释计划,评论中几乎没有变化。然后我看到,这些查询的成本相差一万倍。这与您的问题无关,但一旦问题得到解决,您可以尝试使用EF skip和Take进行优化。您是否检查了索引?如果要按涡轮机编号进行分组和排序,则需要查询可以使用的索引。