既然您使用的是 Code First,那么数据库可能只是应用程序的扩展,而不是它自己的主要目标?在这种情况下,您可能真的不需要视图。
数据库不会关心您是否只发送普通查询,并且您可以在应用程序层中将它们抽象化。最基本的技巧是在您的DbContext 实现(或扩展方法)中创建一个IQueryable<T> 属性,它会查询您希望显示的数据。像这样的:
public sealed class DatabaseContext : DbContext
{
public DbSet<Transaction> Transactions { get; set; }
public IQueryable<PerPersonSum> PerPersonSums
=> Transactions.GroupBy(t => t.Person,
(k, g) => new PerPersonSum
{
Person = k,
TotalAmount = g.Sum(t => t.Amount)
});
}
更合适的解决方案是keyless entity type:
public sealed class DatabaseContext : DbContext
{
public DbSet<Transaction> Transactions { get; set; }
public DbSet<PerPersonSum> PerPersonSums { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<PerPersonSum>(e =>
{
e.HasNoKey();
e.ToQuery(() => Transactions.GroupBy(t => t.Person,
(k, g) => new PerPersonSum
{
Person = k,
TotalAmount = g.Sum(t => t.Amount)
}));
});
}
}
在 3.0 之前,它曾经被称为查询类型,可以这样使用:
public sealed class DatabaseContext : DbContext
{
public DbSet<Transaction> Transactions { get; set; }
public DbQuery<PerPersonSum> PerPersonSums { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Query<PerPersonSum>()
.ToQuery(() => Transactions.GroupBy(t => t.Person,
(k, g) => new PerPersonSum
{
Person = k,
TotalAmount = g.Sum(t => t.Amount)
}));
}
}