EF核心分页。在同一查询中选择总计数

时间:2016-04-07 13:48:25

标签: entity-framework-core

我有分页,我想用简单的sql(EF7)在同一个查询中选择count:

var selectSql = " SELECT TotalCount = COUNT(*) OVER(), E.* FROM [table] E ...";
var rows = context.Set<EventTable>().FromSql<EventTable>(selectSql, parameters.Select(p => p.Value).ToArray()).ToArray();

此选择有效,但我的EventTable类中没有TotalCount属性,因为我不想在数据库中使用该属性。

我尝试从实体跟踪器获取TotalCount属性:

var row = rows.First();
var entity = context.Entry(row);
var totalCount = entity.Property<int>("TotalCount").CurrentValue;

然后我得到错误: 该物业&#39; TotalCount&#39;在实体类型&#39; EventTable&#39;无法找到。确保该属性存在且已包含在模型中。

然后我尝试在模型中添加属性,如下所示:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     modelBuilder.Entity<EventTable>(b => b.Property<int>("TotalCount"));
}

当我想选择时,它工作正常,但它会在插入时抛出异常,因为数据库中的列不存在。 EF将在迁移时添加该列。但我注意到,如果在迁移生成之前我添加了行b.Property(&#34; TotalCount&#34;);在ModelSnapshot类中,它将避免在迁移时添加属性。但插入问题仍然存在。

我尝试创建另一个类:

[NotMapped]
public class EventSearchTable : EventTable
{
    [Column("total_count")]
    [Required]
    public int TotalCount { get; set; }
}

然后执行此操作:

var rows = context.Set<EventSearchTable>().FromSql<EventSearchTable>(..);

它适用于EF6,但不适用于EF7,我收到错误:值不能为空。 参数名称:entityType 因为我的DbContext中没有实体。如果我将在我的DbContext上添加EventSearchTable类,那么它将期望像discriminator等列,并将在迁移中创建表。

任何想法如何获得财产 TotalCount

对不起,如果我的英语坏了。

1 个答案:

答案 0 :(得分:3)

以下查询将在一次数据库中获取计数和页面结果

 var query = context.Set<EventTable>();
 var page = query.OrderBy(e => e.Id)
                 .Select(e => e)
                 .Skip(100).Take(100)
                 .GroupBy(e => new { Total = query.Count() })
                 .FirstOrDefault();

 if (page != null)
 {
      int total = page.Key.Total;
      List<EventTable> events = page.Select(e => e).ToList();
 }