分组分组(跳过)

时间:2017-10-31 06:33:48

标签: entity-framework linq

我正在尝试进行某种分页。但是,我需要在分组结果上进行,因为每次我做一个页面。要求获取给定组的所有数据。

代码如下:

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

我有200k项目,上面的陈述似乎是连接超时的速度太慢。我最好的选择是减慢它的顺序。有任何建议如何做到这一点,或如何加快上述声明?

2 个答案:

答案 0 :(得分:2)

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

+

答案 1 :(得分:1)

GroupBy需要访问所有元素,将所有StatusViews分组为StatusViewsTurbineNumber。{/ p>

在那之后,你从第一个元素的每个组中取出每个组,并要求它的TurbineNumber,按照Turbine Number进行排序。

显然你考虑到一组StatusViews可能是空的(FirstOrDefault,而不是First),但是再次假设FirstOrDefault永远不会返回空。

可以加快查询速度的一个方法是使用您的论坛的KeyKey是您分组的元素,在您的情况下为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);