EF核心分頁。在同一查詢中選擇總計數

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;

但後來我得到錯誤: 無法找到實體類型'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類,那麼它將期望像discriminator等列,並將在遷移中創建表。

任何想法如何獲得屬性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();
 }


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow