我正在尝试进行某种分页。但是,我需要在分组结果上进行,因为每次我做一个页面。要求获取给定组的所有数据。
代码如下:
var erere = dbCtx.StatusViewList
.GroupBy(p => p.TurbineNumber)
.OrderBy(p => p.FirstOrDefault().TurbineNumber)
.Skip(0)
.Take(10)
.ToList();
我有200k项目,上面的陈述似乎是连接超时的速度太慢。我最好的选择是减慢它的顺序。有任何建议如何做到这一点,或如何加快上述声明?
答案 0 :(得分:2)
在您的情况下,根本不需要在服务器端进行分组,因为无论如何您将获得所有数据,但在服务器端有额外的开销。所以尝试另一种方法:
+
答案 1 :(得分:1)
GroupBy
需要访问所有元素,将所有StatusViews
分组为StatusViews
组TurbineNumber
。{/ p>
在那之后,你从第一个元素的每个组中取出每个组,并要求它的TurbineNumber,按照Turbine Number进行排序。
显然你考虑到一组StatusViews
可能是空的(FirstOrDefault
,而不是First
),但是再次假设FirstOrDefault
永远不会返回空。
可以加快查询速度的一个方法是使用您的论坛的Key
。 Key
是您分组的元素,在您的情况下为TurbineNumber
:组中的所有元素都具有相同的TurbineNumber
。
var result = dbCtx.StatusViewList
.GroupBy(statusView => statusView.TurbineNumber)
.OrderBy(group => group.Key)
...
我认为这将是提高绩效的第一步。
但是,您返回固定数量的组。有些组可能很大,有1000个元素,有些组可能很小:只有一个元素。因此,一个页面的结果可以是10个组,每个组具有1000个元素,总共具有10000个元素。它也可以是10组,每组有1个元素,总共10个元素。我不确定这是否是你想要的分页结果。
您不希望页面总是具有相同数量的元素,最好使用相同的TurbineNumber
,如果没有多少相同的TurbineNumbers
填充下一页{ {1}}。如果TurbineNumber
StatusViews
太多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)
}
如果为TurbineNumber创建额外的索引,这将非常快:
在DbContext.OnModelCreating(DbModelBuilder modelBuilder)
:
// Add an extra index on TurbineNumber:
var indexAttribute = new IndexAttribute("TurbineIndex", 0) {IsUnique = false}
var indexAnnotation =new IndexAnnotation(indexAttribute);
modelBuilder.Entity<Statusview>()
.Property(statusView => statusView.TurbineNumber)
.HasColumnAnnotation("MyIndexName", indexAnnotation);