語言集成查詢 (LINQ) 是一組技術的名稱,這些技術建立在將查詢功能直接集成到 C# 語言(以及 Visual Basic 和可能的任何其他 .NET 語言)的基礎上。 借助於 LINQ,查詢現在已是高級語言構造,就如同類、方法、事件等等。
(1)什麼是linq技術?
這個是在《ASP.NET高級程序設計第四版》第一章節中講解asp.net版本中有關於該技術的起源背景,linq是asp.net 3.5 中跟AJAX一起在原來2.0版本上引入的一項新技術。
接下來是13章節中的一些知識點結合我自己的理解,其中我自己也存在兩點疑惑,如果有精通的希望能指導一番,哈哈,進入正題:
linq:縮寫是language integrated query 語言集成查詢,是一項操作內存數據的技術,看完一個小節,感覺跟sql查詢的區別就是它可以將一些數據類對象執行查詢過濾,返回自己請求的數據,也即是說它既可以實現c#源代碼環境中的對象數據查詢,也可以實現關系數據庫數據訪問。
linq技術為我們開發人員提供了五個比較實用的數據訪問類型:
LinQ to Object:可以允許對內存中的類對象查詢。
LinQ to DataSet:可以對內存中的DataSet緩存數據,執行數據訪問。
LinQ to xml :針對XML數據的一種解析封裝可以實現傳統xml解析效果。
LinQ to Entity:這是目前linq技術比較流行的一個亮點了,它提供了對關系數據庫的數據訪問,可以使得開發者不必通過編寫負責ADO.NET的數據訪問層就可以實現數據庫訪問,也可以兩者一起結合使。LinQ相對ADO.NET的優勢在哪裡呢?它真的有ADO.NET如此強大的數據訪問功能呢?這是我今天的第一個疑問,或許還需要後面的學習才能搞明白了。
LinQ to SQL:這個由於只限制sql server數據庫,所以目前已經被LinQ to Entity逐漸取代。
(2)LinQ技術如何開發實現?
LinQ表達式:與我們查詢數據需要編寫SQL語句一樣,是使用它自然需要一個”語句“,就是linq表達式,而且同sql語句一樣也有它自己的語法規則。它也有與SQL語句中類似的一些關鍵字:select where orderby 已經groupby在語法上面也很相似。一會兒在我自己的驗證實例中,會對這個做一個例子說明。
LinQ表達式返回值必須是一個實現了IEnumerable<T>的迭代對象。
對迭代對象進行枚舉時,linq執行它的工作。
(3)關於linQ的延遲執行:linQ表達式中關於執行返回的過程,書中描述的延遲執行的特點,只是說了可能根據解析類型的不同,linQ可能是一次執行完也可以是在進行迭代的過程中逐步執行。但是還是對這個概念很模糊,這是我的第二個疑問,還需要深入學習的時候回顧。
(4)LinQ表達式的幾大核心特點:為了更易於理解以下的部分將會以自己之後的程序驗證來舉例講解其中的特點
我先定義了數據類:
//定義數據類 public class mytestData { public int studentid { set; get; }//list綁定GridView列表屬性不能為只讀否則報錯。 public string name { set; get; } public int age{set;get;} public mytestData(int id, string name, int age) { this.studentid = id; this.name = name; this.age = age; } }
在頁面page_load中初始化測試數據,原本想了想既然是查詢對象數據集合,那就定義一個ArrayList裝載自己的定義的數據類,在編寫LinQ表達式的時候發現了一個問題:
自定義的數據類容器需要有查詢模式的實現,所以也就是說LinQ是支持一部分數據類型的查詢。。。。
解決辦法就是采用List類型:
List<mytestData> mydata = new List<mytestData>();
先來看一個linq表達式的簡單例子:
protected void Page_Load(object sender, EventArgs e) { //定義測試驗證數據 List<mytestData> mydata = new List<mytestData>(); mydata.Add(new mytestData(1, "george", 23)); mydata.Add(new mytestData(2, "lio", 25)); mydata.Add(new mytestData(3, "kaiwen", 20)); mydata.Add(new mytestData(4, "anna", 19)); mydata.Add(new mytestData(5, "angel", 16)); mydata.Add(new mytestData(6, "geo", 27)); mydata.Add(new mytestData(7, "demo", 30)); mydata.Add(new mytestData(8, "哈哈", 22)); //1.最簡單的實現linq表達式 IEnumerable<mytestData> matchs; matchs = from student in mydata //student是查詢mydata集合中的對象的假名 where student.age>20 //查詢過濾條件 select student; //查詢返回滿足過濾條件的matchs的集合 //頁面綁定數據展示 GridView1.DataSource = matchs; GridView1.DataBind(); }
調試查看返回的匹配的數據類型:
頁面效果:
剛才我們對LinQ表達式應該有了初步的認識,現在在結合一些例子說明linQ表達式能夠實現的幾個效果:
投影:其實簡單的說就是select語句支持一些數據類型和字符串數據操作,甚至可以動態定義一個新類返回信息,跟我們之前的sql語句中select語句有一部分類似,linQ表達式可以將查詢返回的數據,支持一些操作返回為我們預期的類型,字符串或是動態新建的類。
但是對於一般值類型操作和自定義返回對象的投影在表達式上還是存在一些差別,現在一個例子做一個演示:
//2、投影--值類型 //注意:這裡的IEnumerable<string>中已經將matchs申明為了string類型,說明返回的是string的迭代對象 IEnumera