使用LinQ實現對資料對象的查詢,linq實現資料對象
因為項目需要,接觸到了LinQ,經過一段時間的學習,對LinQ有了簡單的認識,本文就這個話題做個簡單的敘述。
首先,應該寫出幾個問題,從宏觀上瞭解一下。LinQ是什嗎?為什麼使用LinQ?使用它有什麼好處?
Language-integrated Query (LINQ)(Language Intergrated Query),是一組用於C#和vb語言的擴充,它允許編寫C#或者vb代碼以查詢資料庫相同的方式操作記憶體資料。----百度百科
通俗點說,它就是查詢資料的。那麼為什麼要用它來查詢資料呢,使用它有什麼有點嗎?
我們從稍微抽象一點的角度來考慮這個問題。物件導向的編程和資料訪問的割裂:一物件導向的語言和資料庫有兩套完全不相干的資料類型體系,程式設計語言中的string,在資料庫中就是varchar,這完全沒有統一性可言;二 SQL編碼體驗落後,我們編寫SQL的語句,沒有提示句,只有寫完了,才知道是否正確,客戶體驗度差;三各類查詢語言不一致,XML和資料庫都有各自的資料查詢體系,對象沒有自己的查詢體系。基於以上種種問題,LinQ出現了。
組成上面也提到了,LinQ包括三類內容的查詢,對象,XML檔案和資料庫。對資料庫的查詢分為三個部分:
Linq to sql,
linq to DataSet,
linq to Entities。
查詢方式:LinQ查詢資料有兩種方式,語言查詢和方法查詢。查詢語句實用類似於SQL語句的形式查詢,這種方式可讀性強,但是限制較多,對於多條件查詢很難實現。查詢方法方式:這種方式可讀性不強,但是可以實現很多複雜的查詢要求,因為我們可以將查詢條件單獨做一個方法去實現。通常情況,為了代碼的可讀性,我們首先應該考慮使用查詢語言方式,如果查詢語言難以實現,應該將查詢語言和查詢方法結合起來混編使用,這樣既最大化的實現了代碼可讀性,也增強了查詢功能。
linq的幾種進階查詢方法:
彙總:Max,Min,Count,Sum等;
排序:ThenBy,OrderBy等;
分區:Take,Skip,TakeWhile,SkipWhile等;
集合:Distinct
產生:Range,Repeat
下面是幾個LinQ查詢樣本:
1基於語言、方法混編查詢的方式(linq to objects):
<span style="font-size:18px;">private void btnQuery_Click(object sender, EventArgs e) { //LinQ To Object 基本方法部分 //泛型集合資料 person List<String> person = new List<String>(); person.Add("老 大"); person.Add("老 二"); person.Add("老 三"); person.Add("老 四"); person.Add("老 五"); person.Add("小 六"); person.Add("小 七"); person.Add("小 八"); ////輸出person 所有元素 //var result = from p in person select p; //輸出person中所有以老開頭的人 //語句、方法混編模式,使用語句查詢,使用方法篩選 var result = (from p in person select p).Where(p => p.StartsWith("老")); //列印 result.Print(); } public static void Print(this IEnumerable<String> ie) { //擷取可遍曆的介面 IEnumerator<String> result = ie.GetEnumerator(); while (result.MoveNext()) { Console.WriteLine("\n------------------------\n"); Console.WriteLine(result.Current); Console.WriteLine("\n------------------------\n"); } } </span>
這段代碼首先定義了一個泛型集合對象person,然後使用查詢語句和查詢費昂發混編模式查詢出以“老”開頭的人,然後列印出來。查詢語句不能完成所有的查詢功能,需要藉助查詢方法來篩選,本例中的查詢方法為系統提供。可以看出來,查詢語句可讀性強,但是功能不夠強大,查詢方法可讀性不強,功能比較多。
<span style="font-size:18px;">2 基於查詢方法模式(linq to objects)private void btnSelect_Click(object sender, EventArgs e) { //LinQ To Object 基本方法部分 //泛型集合資料 person List<String> person = new List<String>(); person.Add("老 大"); person.Add("老 二"); person.Add("老 三"); person.Add("老 四"); person.Add("老 五"); person.Add("小 六"); person.Add("小 七"); person.Add("小 八"); //方法四 調用外部複雜方法作為查詢條件 var result = person.Where(p => Judge(p));}public bool Judge(String s) { if (s.StartsWith("老")) { return true; } else { return false; } } </span>
本段代碼功能同上,完全使用查詢方法完成了篩選功能,這個方法不同於上例中的方法,此方法是重新定義的方法。
<span style="font-size:18px;">3 基於資料庫的查詢(LinQ to Entities)public ActionResult Index() {//1 使用linq語句擷取實體資料//查詢條件中使用了lambda運算式List<Models.BlogArticle> list = (from b in db.BlogArticle where b.AIsDel ==false select b).ToList ();//2 使用viewdata擷取資料 ViewData["DataList"] = list; // 3 載入視圖 list.Print();} public partial class BlogArticle {實體代碼:略 }</span>
<span style="background-color: rgb(255, 255, 255);"> </span><span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;"> </span>
本例中,我們只是將資料對象替換成了實體集合,基本文法相同。
優點:書寫簡單,容易上手。以對象的形式查詢資料,配合查詢語句和查詢方法的使用,是資料查詢更加直觀。
缺點:linq使用消極式載入功能,將待操作資料放入記憶體中,佔用了大量資源,造成資源浪費。