由之前的一篇文章《.net core Entity Framework 与 EF Core》我们都已经知道 EF Core 增加了许多特性, 并且性能上也有了很大的提升.
但是 EF Core 是不支持存储过程及视图的映射的, 那么直接通过 DbContext 是没有办法直接调用 (就是不能直接 "点" 出来) 到存储过程与视图的.
上一篇《.net core EF Core 调用存储过程》中已经讲到了存储过程的调用了, 这篇就只讲视图了.
对视图来讲, 在数据库中 EF Core 根本不知道分不清数据表跟视图的区别, 这也导致了无法直接通过 DbContext 直接进行调用视图.
我们来用最简单的 一个. net core 提供的映射的方法 -- DbQuery(还是用之前的测试数据库), 直接用 mssql 管理工具创建视图:
创建好视图后, 我们同样可以在数据库中看到这个视图:
视图就准备好了, 那么, 我们接口手动创建一个, 用于映射的实体, 里面的字段与视图返回的结果一致, 名称就无所谓了, 因为可以直接映射到对应的视图:
- public class View_BookDetails
- {
- public int Id { get; set; }
- public int Cateid { get; set; }
- public string Name { get; set; }
- public string Author { get; set; }
- public DateTime Createtime { get; set; }
- public bool Isdel { get; set; }
- public string CateName { get; set; }
- }
接下来就是使用 DbQuery 进行映射了
- public partial class LibraryContext : DbContext
- {
- public LibraryContext()
- {
- }
- public LibraryContext(DbContextOptions<LibraryContext> options)
- : base(options)
- {
- }
- public DbQuery<View_BookDetails> View_BookDetails { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.HasAnnotation("ProductVersion", "2.2.3-servicing-35854");
- modelBuilder.Query<View_BookDetails>().ToView("View_BookTable");
- }
- }
重点就两句:
我们调用试试看, 通过映射后, 我们可以直接 "点" 出来了:
- // 调用视图
- var books = _context.View_BookDetails.ToList();
结果:
用这个简单的方式, 就可以调用到映射好的视图了. 当然, 我们还可以换一种方法去查, 直接去掉
这句, 这句只是在 DbContext 上下文中进行了预定义而已. Dbset 是允许这样的, 同样 DbContext 实例的 Set 方法也可以. 然后用下面的这句, 查出来的结果是一样的:
var results = _context.Query<View_BookDetails>().ToList();
同样的, 我们也可以用 Linq 去进行条件查询, 比如:
- // 调用视图
- var books = _context.View_BookDetails.Where(x=>x.Name.Contains("C# 高级")).ToList();
挺有意思的吧, 当然, 不在 DbContext 上下文中进行了预定义的方式也是一样一样的, 可以举一反三地去玩一下.
最后来点有意思的, modelBuilder 那里还有另外一种玩法(这玩法不新鲜, 不常用), 我另外定义一个实体, 主要是用来统计的:
(1)定义统计的实体类 CateStatsView:
- /// <summary>
- /// 分类中书的数量及作者清单: 统计书的数量和作者的数量
- /// </summary>
- public class CateStatsView
- {
- public CateStatsView(string name, int bookCount, int authorCount)
- {
- Name = name;
- BookCount = bookCount;
- AuthorCount = authorCount;
- }
- public string Name { get; set; }
- public int BookCount { get; set; }
- public int AuthorCount { get; set; }
- }
(2)在 OnModelCreating 中定义查询的实体, 并在进行统计:
- modelBuilder.Query<CateStatsView>().ToQuery(
- () => Categories.Select(m => new CateStatsView(
- m.Name,
- m.Books.Count,
- m.Books.Select(a => a.Author).Distinct().Count()
- )
- )
- );
(3)调用并返回结果:
var results = _context.Query<CateStatsView>().ToList();
结果:
最后: 视图的作用的话, 本来就是可以理解成表, 本质上来讲, 生成的也就是 SQL 语句进行查询. 这次讲的都是很简单的 .net core 中视图的应用. 实现的方式都是多种多样的, 就像条条大路通罗马. 了解多点不是坏事.
来源: https://www.cnblogs.com/Vam8023/p/10789131.html