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