EF 核心分页。 Select 同一查询中的总计数

EF core paging. Select total count in same query

我有分页,我想 select 使用简单的 sql (EF7):

在同一个查询中计数
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();

这个 select 有效,但我的 EventTable class 中没有 TotalCount 属性,因为我不希望数据库中有那个 属性。

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

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

但是我得到了错误: 找不到实体类型 'EventTable' 上的 属性 'TotalCount'。确保 属性 存在并已包含在模型中。

然后我尝试像这样在模型中添加 属性:

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

当我想 select 时它工作正常,但它在插入时抛出异常,因为数据库中的列不存在。 EF 将添加有关迁移的专栏。但我注意到,如果在迁移生成之前我添加行 b.Property("TotalCount");进入 ModelSnapshot class 它将避免在迁移时添加 属性。但是insert的问题依然存在

我尝试创建另一个 class:

[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中没有entity。如果我将在我的 DbContext 上添加 EventSearchTable class,那么它将期望像鉴别器等列,并将在迁移中创建 table。

关于如何获得 属性 TotalCount 的任何想法?

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

 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();
 }