.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 視圖的應用