Farseer.net輕量級ORM開源框架 V1.x 入門篇:表的數據操作


導航

目   錄:Farseer.net輕量級ORM開源框架 目錄

上一篇:Farseer.net輕量級ORM開源框架 V1.x 入門篇:表實體類映射

下一篇:Farseer.net輕量級ORM開源框架 V1.x 入門篇:視圖實體類映射

前言

  先跟大家抱歉下,教程遲遲沒有更新,因為一個人的精力實在有限(借口?好吧,我認了)。

  想要Farseer.Net發展的更好,需要認真、客觀解讀群里朋友們的建議,實際上也確實是這樣,有些思想、功能自己確實沒想到(必境我自己所能接觸的業務場景是非常有限的)。

  當然在考慮Farseer.Net新功能時,我一直提倡的是輕量(非深度植入、應用場景很特殊的場景)級的。出來的功能是大家喜歡的,而不是負累。

  另外,DEMO一直遲遲沒有出來。有些朋友不喜歡看文字教程,而喜歡來”真“的,只看代碼。勝過枯燥的細述。(比如不喜歡看MSDN的幫助,而喜歡看大家分享的例子)。

  好,言歸正傳。回顧上篇文章的講解中,我們知道如何來映射一個實體類了。對於表的操作,我們知道TableSet的作用。那這篇實質就是在講TableSet的使用。

TableSet<TEntity>

  它在命名空間:FS.Core.Data.Table

  首先,先列出,我們必須用到的幾個前提方法:

 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 // 在查詢時,進行字段篩選,否則將以*號查詢
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提供的靜態方式調用,事實上我們也可以這樣調用:

二、實例化調用

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條件使用技術

  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的方式的。這樣可以降低我們的學習門檻。對於大家而言,當然希望功能豐富,而使用簡單,這也是我一直在努力的目標。

  好,講解完畢,我們下一篇見!

導航

目   錄:Farseer.net輕量級開源框架 目錄

上一篇:Farseer.net輕量級開源框架 V1.x 入門篇:表實體類映射

下一篇:Farseer.net輕量級開源框架 V1.x 入門篇:視圖實體類映射

廣告時間

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" });

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM