.net core EF Core 檢視的應用

Vam8023發表於2019-05-07

 由之前的一篇文章《.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 中檢視的應用。實現的方式都是多種多樣的,就像條條大路通羅馬。瞭解多點不是壞事。

相關文章