【问题标题】:EF core paging. Select total count in same queryEF 核心分页。在同一查询中选择总计数
【发布时间】:2020-03-16 02:14:05
【问题描述】:

我有分页,我想使用简单的 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();

此选择有效,但我的 EventTable 类中没有 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"));
}

当我想选择时它工作正常,但它在插入时抛出异常,因为数据库中的列不存在。 EF 将在迁移中添加该列。但我注意到,如果在迁移生成之前添加行 b.Property("TotalCount");到 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 类,那么它将期望诸如鉴别器等列,并将在迁移中创建表。

任何想法如何获取属性 TotalCount

【问题讨论】:

    标签: entity-framework-core


    【解决方案1】:

    下面的查询会得到一趟数据库的计数和页面结果

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

    【讨论】:

    • 当结果集为空时(至少在 EF 核心中),这将失败。页面不为空,但有一个内部 NullReferenceException。
    • 结果集为空时确实会失败。有什么解决办法吗?
    • 此解决方案不起作用。是3.0之前的吗?在 3.0 中,它们禁用了静默评估。现在,当触发两个查询时,您会收到错误消息。如果 4 年前提出问题,为什么它被标记为 entity-framework-core? ef core 还不存在。
    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 2014-09-05
    • 2021-05-28
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2020-01-18
    相关资源
    最近更新 更多