我有分页,我想用简单的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 ?
对不起,如果我的英语坏了。
答案 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();
}