.net core EF Core 视图的应用

Posted vam8023

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net core EF Core 视图的应用相关的知识,希望对你有一定的参考价值。

 由之前的一篇文章《.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 中视图的应用。实现的方式都是多种多样的,就像条条大路通罗马。了解多点不是坏事。

以上是关于.net core EF Core 视图的应用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 EF Core 代码优先迁移为 ASP.NET Core MVC 配置 N 层架构

.NET使用一行命令轻松生成EF Core项目框架

如何使用 EF Core 在 ASP.NET Core 中取消应用迁移

用于 ASP.NET Core 应用程序的 EF Code First 迁移替代方案

非托管代码中的 ASP Net Core 1.1 和 EF 6 异常?

具有 ASP.NET Core 3.0 和 EF Core 的多租户应用程序