咱們知道對於關係數據庫,視圖的出現能夠在必定的狀況下減小因要進行數據關聯而帶來的大量SQL語句,它可讓咱們就像訪問一張表同樣的簡單操做。框架
做爲ORM來講,支持視圖也是一項最基礎的工做。然而大部份的ORM中,對視圖沒有特地去提供這個類,由於視圖的SQL與表的SQL是一致的,所以能夠將視圖當成表來訪問操做。工具
而在Farseer.Net裏爲視圖提供了專門的類的目的是告訴開發者,它是一個只讀「表」,僅讀、而不能進行任何數據更新操做。spa
在前一篇文章裏,咱們學會了視圖的映射,其它它與表的映射是基本一致的。除了表是使用:TableSet,而視圖使用的是ViewSet。.net
到目前爲止,相信你們也知道了xxxSet的做用,就是爲這些特定「表」、「視圖」、「存儲過程」提供它們專用的方法,以便咱們對數據庫進去操做。code
前面也講到過ViewSet與TableSet他們都繼承了:DbReadSet<TSet, TEntity> 這個類htm
/// <summary> /// 視圖操做 /// </summary> /// <typeparam name="TEntity">實體</typeparam> public sealed class ViewSet<TEntity> : DbReadSet<ViewSet<TEntity>, TEntity> where TEntity : class, new() /// <summary> /// 表操做 /// </summary> /// <typeparam name="TEntity"></typeparam> public sealed class TableSet<TEntity> : DbReadSet<TableSet<TEntity>, TEntity> where TEntity : class, new()
換句話說,他們都共同包含了DbReadSet提供的方法、屬性。對象
在表的數據操做一篇中,已經講到了如何進行操做一張表。包括了讀數據、寫數據這兩類,而從字面理解上咱們也知道了DbReadSet是爲讀數據提供的一個數據庫操做類。
所以視圖的操做,就至關因而表的讀操做那一部份。
既然如此,那麼很明顯,它們的調用方式也是同樣的。
1 // 在查詢時,進行字段篩選,不然將以*號查詢 2 View.Data.Account.Select(o=>o.ID).Select(o=>new {o.UserName,o.LoginCount}); 3 // 查詢或者更新時,限定條件 4 View.Data.Account.Where(o=>o.ID); 5 // 排序方式 6 View.Data.Account.Desc(o=>o.ID).Asc(o=>new {o.LoginCount,o.CreateAt}); 7 View.Data.Account.Asc(o=>o.ID);
1 using(var context = new View()) 2 { 3 context.Account.Select(o=>new{ o.ID, o.UserName}).Where(o=>o.ID > 0).Desc(o=>o.ID) 4 }
/// <summary> 查詢多條記錄(不支持延遲加載) </summary> /// <param name="top">限制顯示的數量</param> /// <param name="isDistinct">返回當前條件下非重複數據</param> /// <param name="isRand">返回當前條件下隨機的數據</param> public virtual DataTable ToTable(int top = 0, bool isDistinct = false, bool isRand = false) /// <summary> 查詢多條記錄(不支持延遲加載) </summary> /// <param name="pageSize">每頁顯示數量</param> /// <param name="pageIndex">分頁索引</param> /// <param name="isDistinct">返回當前條件下非重複數據</param> /// <returns></returns> public virtual DataTable ToTable(int pageSize, int pageIndex, bool isDistinct = false) /// <summary> 查詢多條記錄(不支持延遲加載) </summary> /// <param name="pageSize">每頁顯示數量</param> /// <param name="pageIndex">分頁索引</param> /// <param name="recordCount">總記錄數量</param> /// <param name="isDistinct">返回當前條件下非重複數據</param> public virtual DataTable ToTable(int pageSize, int pageIndex, out int recordCount, bool isDistinct = false) /// <summary> 查詢多條記錄(不支持延遲加載) </summary> /// <param name="top">限制顯示的數量</param> /// <param name="isDistinct">返回當前條件下非重複數據</param> /// <param name="isRand">返回當前條件下隨機的數據</param> public virtual List<TEntity> ToList(int top = 0, bool isDistinct = false, bool isRand = false) /// <summary> /// 查詢多條記錄(不支持延遲加載) /// </summary> /// <param name="pageSize">每頁顯示數量</param> /// <param name="pageIndex">分頁索引</param> /// <param name="isDistinct">返回當前條件下非重複數據</param> /// <returns></returns> public virtual List<TEntity> ToList(int pageSize, int pageIndex, bool isDistinct = false) /// <summary> /// 查詢多條記錄(不支持延遲加載) /// </summary> /// <param name="pageSize">每頁顯示數量</param> /// <param name="pageIndex">分頁索引</param> /// <param name="recordCount">總記錄數量</param> /// <param name="isDistinct">返回當前條件下非重複數據</param> public virtual List<TEntity> ToList(int pageSize, int pageIndex, out int recordCount, bool isDistinct = false) /// <summary> /// 返回篩選後的列表 /// </summary> /// <typeparam name="TEntity">實體類</typeparam> /// <typeparam name="T">實體類的屬性</typeparam> /// <param name="select">字段選擇器</param> public virtual List<T> ToSelectList<T>(Expression<Func<TEntity, T>> select) /// <summary> /// 返回篩選後的列表 /// </summary> /// <param name="top">限制顯示的數量</param> /// <param name="select">字段選擇器</param> /// <typeparam name="TEntity">實體類</typeparam> /// <typeparam name="T">實體類的屬性</typeparam> public virtual List<T> ToSelectList<T>(int top, Expression<Func<TEntity, T>> select) /// <summary> /// 返回篩選後的列表 /// </summary> /// <param name="select">字段選擇器</param> /// <param name="lstIDs">o => IDs.Contains(o.ID)</param> /// <typeparam name="TEntity">實體類</typeparam> /// <typeparam name="T">實體類的屬性</typeparam> /// <param name="memberName">條件字段名稱,如爲Null,默認爲主鍵字段</param> public virtual List<T> ToSelectList<T>(List<T> lstIDs, Expression<Func<TEntity, T>> select, string memberName = null) /// <summary> /// 返回篩選後的列表 /// </summary> /// <param name="select">字段選擇器</param> /// <param name="lstIDs">o => IDs.Contains(o.ID)</param> /// <param name="top">限制顯示的數量</param> /// <typeparam name="TEntity">實體類</typeparam> /// <typeparam name="T">實體類的屬性</typeparam> /// <param name="memberName">條件字段名稱,如爲Null,默認爲主鍵字段</param> public virtual List<T> ToSelectList<T>(List<T> lstIDs, int top, Expression<Func<TEntity, T>> select, string memberName = null) /// <summary> /// 查詢單條記錄(不支持延遲加載) /// </summary> public virtual TEntity ToEntity() /// <summary> /// 獲取單條記錄 /// </summary> /// <typeparam name="T">ID</typeparam> /// <param name="ID">條件,等同於:o=>o.ID.Equals(ID) 的操做</param> /// <param name="memberName">條件字段名稱,如爲Null,默認爲主鍵字段</param> public virtual TEntity ToEntity<T>(T ID, string memberName = null) /// <summary> /// 查詢數量(不支持延遲加載) /// </summary> public virtual int Count(bool isDistinct = false, bool isRand = false) /// <summary> /// 獲取數量 /// </summary> /// <typeparam name="T">ID</typeparam> /// <param name="ID">條件,等同於:o=>o.ID.Equals(ID) 的操做</param> /// <param name="memberName">條件字段名稱,如爲Null,默認爲主鍵字段</param> public virtual int Count<T>(T ID, string memberName = null) /// <summary> /// 獲取數量 /// </summary> /// <typeparam name="T">ID</typeparam> /// <param name="lstIDs">條件,等同於:o=> IDs.Contains(o.ID) 的操做</param> /// <param name="memberName">條件字段名稱,如爲Null,默認爲主鍵字段</param> public virtual int Count<T>(List<T> lstIDs, string memberName = null) /// <summary> /// 查詢數據是否存在(不支持延遲加載) /// </summary> public virtual bool IsHaving() /// <summary> /// 判斷是否存在記錄 /// </summary> /// <typeparam name="T">ID</typeparam> /// <param name="ID">條件,等同於:o=>o.ID == ID 的操做</param> /// <param name="memberName">條件字段名稱,如爲Null,默認爲主鍵字段</param> public virtual bool IsHaving<T>(T ID, string memberName = null) /// <summary> /// 判斷是否存在記錄 /// </summary> /// <typeparam name="T">ID</typeparam> /// <param name="lstIDs">條件,等同於:o=> IDs.Contains(o.ID) 的操做</param> /// <param name="memberName">條件字段名稱,如爲Null,默認爲主鍵字段</param> public virtual bool IsHaving<T>(List<T> lstIDs, string memberName = null) /// <summary> /// 查詢單個值(不支持延遲加載) /// </summary> public virtual T GetValue<T>(Expression<Func<TEntity, T>> fieldName, T defValue = default(T)) /// <summary> /// 查詢單個值 /// </summary> /// <typeparam name="T1">ID</typeparam> /// <typeparam name="T2">字段類型</typeparam> /// <param name="ID">條件,等同於:o=>o.ID.Equals(ID) 的操做</param> /// <param name="fieldName">篩選字段</param> /// <param name="defValue">不存在時默認值</param> /// <param name="memberName">條件字段名稱,如爲Null,默認爲主鍵字段</param> public virtual T2 GetValue<T1, T2>(T1 ID, Expression<Func<TEntity, T2>> fieldName, T2 defValue = default(T2), string memberName = null) /// <summary> /// 累計和(不支持延遲加載) /// </summary> public virtual T Sum<T>(Expression<Func<TEntity, T>> fieldName, T defValue = default(T)) /// <summary> /// 查詢最大數(不支持延遲加載) /// </summary> public virtual T Max<T>(Expression<Func<TEntity, T>> fieldName, T defValue = default(T)) /// <summary> /// 查詢最小數(不支持延遲加載) /// </summary> public virtual T Min<T>(Expression<Func<TEntity, T>> fieldName, T defValue = default(T))
能夠很清楚的看出,上面提供的方法均是讀操做。而沒有任何的寫操做。同時這部份方法也是被TableSet支持的(又囉嗦了,照顧下新人)。
好比咱們獲取一條數據是:
View.Data.Account.Select(o => o.ID).Select(o => o.Name).Where(o => o.ID > 1).ToEntity();
咱們獲取一批數據是:
View.Data.Account.Select(o => o.ID).Select(o => o.Name).Where(o => o.ID > 0).Asc(o => o.ID).ToList();
其它的就再也不舉例了。你們能夠自行嘗試下。
視圖的方法,實際就是等同於表的讀方法那部份,所以你們學會了表的操做以後,同樣懂得如何操做視圖(方法、參數一致)。
因爲Farseer.net暫時未提供複雜的SQL查詢功能。所以用視圖來進行轉化下也是一種很方便的手段。
QQ羣:116228666 (Farseer.net開源框架交流) 請註明:Farseer.Net
Farseer.Net是一款ORM框架 + 經常使用工具 + 擴展集合。
Farseer 寓意:先知、預言家 一般在某些場合時,提供計謀、策略。也但願該框架能給你們提供最大化的便捷。
ORM:其英文全稱是:Object(對象) Relational(關係) Mapping(映射)
Farseer.Net的目標是:快速上手、快速開發、簡單方便。
1 Table.Data.User.Where(o=>o.ID == 1).ToEntity(); 2 Table.Data.User.Where(o=>o.ID > 1).ToList(); 3 Table.Data.User.Where(o=>o.ID != 0).Delete(); 4 Table.Data.User.Where(o=>o.ID != 0).AddUp(o=>o.LoginCount, 1); 5 Table.Data.User.Where(o=>o.ID == 1).Update(new User{ UserName = "newName" }); 6 Table.Data.User.Insert(new User{ UserName = "newName" });