1. 程式人生 > >.net core EF Core 視圖的應用

.net core EF Core 視圖的應用

entity 增加 blog cat 2.3 mss 不能 支持 創建

由之前的一篇文章《.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 視圖的應用