我們知道對於關系數據庫,視圖的出現可以在一定的情況下減少因要進行數據關聯而帶來的大量SQL語句,它可以讓我們就像訪問一張表一樣的簡單操作。
作為ORM來說,支持視圖也是一項最基礎的工作。然而大部份的ORM中,對視圖沒有特意去提供這個類,因為視圖的SQL與表的SQL是一致的,因此可以將視圖當成表來訪問操作。
而在Farseer.Net里為視圖提供了專門的類的目的是告訴開發者,它是一個只讀“表”,僅讀、而不能進行任何數據更新操作。
在前一篇文章里,我們學會了視圖的映射,其它它與表的映射是基本一致的。除了表是使用:TableSet,而視圖使用的是ViewSet。
到目前為止,相信大家也知道了xxxSet的作用,就是為這些特定“表”、“視圖”、“存儲過程”提供它們專用的方法,以便我們對數據庫進去操作。
前面也講到過ViewSet與TableSet他們都繼承了:DbReadSet<TSet, TEntity> 這個類
/// <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" });