先跟你們抱歉下,教程遲遲沒有更新,由於一我的的精力實在有限(藉口?好吧,我認了)。框架
想要Farseer.Net發展的更好,須要認真、客觀解讀羣裏朋友們的建議,實際上也確實是這樣,有些思想、功能本身確實沒想到(必境我本身所能接觸的業務場景是很是有限的)。工具
固然在考慮Farseer.Net新功能時,我一直提倡的是輕量(非深度植入、應用場景很特殊的場景)級的。出來的功能是你們喜歡的,而不是負累。學習
另外,DEMO一直遲遲沒有出來。有些朋友不喜歡看文字教程,而喜歡來」真「的,只看代碼。賽過枯燥的細述。(好比不喜歡看MSDN的幫助,而喜歡看你們分享的例子)。ui
好,言歸正傳。回顧上篇文章的講解中,咱們知道如何來映射一個實體類了。對於表的操做,咱們知道TableSet的做用。那這篇實質就是在講TableSet的使用。spa
它在命名空間:FS.Core.Data.Table.net
首先,先列出,咱們必須用到的幾個前提方法:設計
1 /// <summary> 2 /// 字段選擇器 3 /// </summary> 4 /// <param name="select">字段選擇器</param> 5 public virtual TSet Select<T>(Expression<Func<TEntity, T>> select) 6 7 /// <summary> 8 /// 查詢條件 9 /// </summary> 10 /// <param name="where">查詢條件</param> 11 public virtual TSet Where(Expression<Func<TEntity, bool>> where) 12 13 /// <summary> 14 /// 倒序查詢 15 /// </summary> 16 /// <typeparam name="TKey">實體類屬性類型</typeparam> 17 /// <param name="desc">字段選擇器</param> 18 public virtual TSet Desc<TKey>(Expression<Func<TEntity, TKey>> desc) 19 20 /// <summary> 21 /// 正序查詢 22 /// </summary> 23 /// <typeparam name="TKey">實體類屬性類型</typeparam> 24 /// <param name="asc">字段選擇器</param> 25 public virtual TSet Asc<TKey>(Expression<Func<TEntity, TKey>> asc)
那麼咱們調用的方式是:
1、靜態調用方式
1 // 在查詢時,進行字段篩選,不然將以*號查詢 2 Table.Data.User.Select(o=>o.ID).Select(o=>new {o.UserName,o.LoginCount}); 3 // 查詢或者更新時,限定條件 4 Table.Data.User.Where(o=>o.ID); 5 // 排序方式 6 Table.Data.User.Desc(o=>o.ID).Asc(o=>new {o.LoginCount,o.CreateAt}); 7 Table.Data.User.Asc(o=>o.ID);
Table在上篇博客講解中,咱們知道它是咱們本身定義的上下文,繼承自DbContext,Data屬性是DbContext提供的靜態方式調用,事實上咱們也能夠這樣調用:
2、實例化調用
1 using(var context = new Table()) 2 { 3 context.User.Select(o=>new{ o.ID, o.UserName}).Where(o=>o.ID > 0).Desc(o=>o.ID) 4 }
須要知道的是,以上的Where、Select、Desc、Asc調用後,返回的仍然是TableSet<TEntity>類型。這樣,咱們能夠繼續進行下一個Where、Select、Desc、Asc的調用,或者最終對數據的獲取、更新操做。
第二種方式一般在對數據庫進行屢次(一個邏輯裏面)數據更新、插入時操做。固然這種方式保存的時候默認是開啓事務的(查詢不是),您也能夠手動調用重截來不開啓它:SaveChange(false);
Where方法是提供咱們對數據的條件篩選功能。好比經常使用的以下:
// 這是最經常使用的 屬性判斷 Table.Data.User.Where(o => o.ID == 1) Table.Data.User.Where(o => o.ID > 1 || o.ID < 1) Table.Data.User.Where(o => o.ID < 1 && o.UserName.Length > 0) // 批量包含數據元素:1, 2, 3, 4, 5 相似SQL 的 in 操做 var lst = new List<int> { 1, 2, 3, 4, 5 }; Table.Data.User.Where(o => lst.Contains(o.ID)) // 模糊搜索 相似 SQL的 like %...% Table.Data.User.Where(o => o.UserName.Contains(keywords)); // 固然也支持多條件 Table.Data.User.Where(o => o.ID >= 1 && ( o.UserName == "張三" || o.RoleID == 1) ) // 模糊搜索 + 高級搜索 var keywords = ""; var bean = Table.Data.User; // 也能夠是: var bean = Table.Data.User.Select(o => new { o.UserName, o.PassWord }) bean.Where(o => o.ID > 1); if (keywords.IsHaving()) { bean.Where(o => o.UserName.Contains(keywords)); } // 當Keywords有值時,進行模糊搜索 // 能夠加入 或者 的操做 bean.WhereOr(o => o.RoleID == 2); var lst = bean.ToList(); // 相似於: like '張% 以 張開頭 Table.Data.User.Where(o => o.UserName.StartsWith("張")); // 相似於: like '%三 以 三結尾 Table.Data.User.Where(o => o.UserName.EndsWith("三")); // 忽略大小寫 Oracle中查詢時默認區別大小寫的 Table.Data.User.Where(o => o.UserName.IsEquals("張三")); // 查詢用戶名的長度大於2位 Table.Data.User.Where(o => o.UserName.Length > 2); // 查詢 時間區別: 2014-11-06 到 2014-11-06 的數據 DateTime dt = new DateTime(2014,11,6); Table.Data.User.Where(o => o.CreateAt >= dt && o.CreateAt < dt.AddDays(1)); // 位運算 Table.Data.User.Where(x => (x.SchoolAdmissionsType & schoolAdmissionsType) == schoolAdmissionsType);}
// 返回DataTable List<DataTable> lst = Table.Data.User.Where(o=>o.ID > 0).ToTable(); // 返回List<User> List<User> lst = Table.Data.User.Where(o=>o.ID > 0).ToList(); // 返回指定字段列表 List<int> lst = Table.Data.User.Where(o=>o.ID > 0).ToSelectList(o=>o.ID); // 返回單個實體 User user = Table.Data.User.Where(o=>o.ID == 1).ToEntity(); // 返回數量 int count = Table.Data.User.Where(o=>o.ID != 1).Count(); // 返回是否存在 bool isHave = Table.Data.User.Where(o=>o.ID != 1).IsHaving(); // 返回單個字段的值 int ID = Table.Data.User.Where(o=>o.ID != 1).GetValue(o=>o.ID,0); // 返回累計總和 int sum = Table.Data.User.Where(o=>o.ID != 1).Sum(o=>o.ID,0); // 返回最大值 int ID = Table.Data.User.Where(o=>o.ID != 1).Max(o=>o.ID,0); // 返回最小值 int ID = Table.Data.User.Where(o=>o.ID != 1).Min(o=>o.ID,0);
怎麼樣,愛上Farseer.Net了沒,查詢數據就是這麼方便。沒有?那咱們繼續看下面的更新數據的演示
var ID = 0; using (var context = new Table()) { // 獲取指定ID ID = context.User.Desc(o => o.ID).ToEntity().ID.GetValueOrDefault(); // 更新UserName context.User.Where(o => o.ID == ID).Update(new UserVO() { UserName = "zz" }); // 提交保存 context.SaveChanges(); } // 不一樣方式的更新 Table.Data.User.Where(o => o.ID == ID).Update(new UserVO() { UserName = "bb" }); // 重載版本的更新 Table.Data.User.Update(new UserVO() { UserName = "bb", ID = ID });
// 獲取總數量 var count = Table.Data.User.Count(); var currentCount = 0; UserVO info; using (var context = new Table()) { info = new UserVO() { UserName = "xx" }; // 插入數據 context.User.Insert(info, true); context.SaveChanges(); // 獲取指定實體 info = context.User.Desc(o => o.ID).ToEntity(); // 獲取數量 currentCount = context.User.Count(); } // 不一樣方式插入數據 Table.Data.User.Insert(new UserVO() { UserName = "yy" }); // 獲取實體 info = Table.Data.User.Desc(o => o.ID).ToEntity(); // 獲取數量 currentCount = Table.Data.User.Count(); // GUID Table.Data.Orders.Insert(new OrdersVO { ID = Guid.NewGuid(), OrderNo = "1234567890", CreateAt = DateTime.Now, CreateID = 1, CreateName = "用戶1" });
還沒完,咱們還有更新時 FieldName = FieldName + 1的更新方式:
using (var context = new Table()) { // 查詢實體 var info = context.User.Desc(o => o.ID).ToEntity(); // 更新LoginCount字段 context.User.Where(o => o.ID == info.ID).AddAssign(o => new { LoginCount = o.LogCount }, 4).AddUp(); context.SaveChanges(); }
AddAssign方法是追加要更新的字段。意味着你能夠追加多個字段,給與不一樣值的累加(或者減)。
// 刪除ID == 100的數據。 Table.Data.User.Where(o=>o.ID == 100).Delete();
而後,完了?沒錯,就完了。
事實上,上面的代碼演示,並不是所有,其中有不少重載版本,這些重載是爲了減輕調用的代碼量而設計的,經過本身調用時傳入Lambda也同樣能夠實現,並不是本篇講解的重點,因此就不一一貼出來了。
經過本篇的簡單講解,事實上你已經會用Farseer.Net來對數據庫的維護了,而且視圖的操做其實也是相同的操做(只是少了對數據的更新、插入、刪除操做,僅此而已)。
而且你能體會到,Farseer.Net在對數據操做時,是很是像LINQ的方式的。這樣能夠下降咱們的學習門檻。對於你們而言,固然但願功能豐富,而使用簡單,這也是我一直在努力的目標。
好,講解完畢,咱們下一篇見!
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" });