Поскольку вы используете Code First, может быть, база данных - это просто расширение для приложения, а не его основная цель? В этом случае вам, вероятно, на самом деле не нужно представление.
Для базы данных все равно, если вы просто отправляете ей обычные запросы, и у вас есть альтернативы для их абстрагирования на прикладном уровне. Самый простой способ - просто создать свойство IQueryable<T>
в вашей реализации DbContext
(или метод расширения), которое запрашивает данные, которые вы хотите отобразить. Примерно так:
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)
});
}
Более подходящим решением будет тип ключа без ключа :
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)
}));
});
}
}
Pre-3.0, раньше он назывался QueryВведите и это можно использовать так:
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)
}));
}
}