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进行优化。您是否检查了索引?如果要按涡轮机编号进行分组和排序,则需要查询可以使用的索引。