1. 程式人生 > >使用LinQ實現對資料物件的查詢

使用LinQ實現對資料物件的查詢

因為專案需要,接觸到了LinQ,經過一段時間的學習,對LinQ有了簡單的認識,本文就這個話題做個簡單的敘述。

首先,應該寫出幾個問題,從巨集觀上了解一下。LinQ是什麼?為什麼使用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使用延遲載入功能,將待操作資料放入記憶體中,佔用了大量資源,造成資源浪費。