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();
}
我有分页,我想 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();
}