簡:數據庫
LINQ全稱是Language Integrated Query,中文「語言集成查詢」。LINQ是一種查詢技術,有LINQ toSQL、LINQ to Object、數組
LINQ to ADO.Net、LINQ to XML、 LINQ to EF等。架構
LINQ與直接SQL語句比較:編輯器
1.SQL數據庫技術是一門相對比較複雜深奧的技術,不是人人都懂,而LINQ to SQL比較簡單(實際上底層都對數據庫操做進行了性能
封裝,架構了數據訪問層)學習
2.直接寫SQL語句,若是有問題,只有到運行時才知道。spa
3.LINQ to SQL能夠很好的防止注入攻擊code
4.LINQ是面向對象的查詢,主要在程序內部使用(好比查找所須要的數據),比使用DataReader讀取數據等方便多了;直接寫對象
SQL是面向關係型數據庫的查詢。blog
5.從運行效率上來講性能不如直接SQL語句,可是開發效率提升了。
要學習LINQ首先要學習LINQ查詢表達式。
LINQ的查詢有3個基本部分組成;獲取數據源,建立查詢,執行查詢
static void Main(string[] args) { //【1】獲取數據源 List<int> s = new List<int>() { 1,2,5,88,9,4,55,3}; //【2】建立查詢 var number = from num in s where num % 2 == 0 select num * 10; //與SQL語句比較下 //select * from s where id%2==0 //【3】執行查詢 foreach (var item in number) { Console.WriteLine(item); } Console.ReadKey(); }
在LINQ中,查詢的執行與查詢自己大相徑庭,換句話說,若是隻是建立查詢變量,則不會檢索任何數據。
LINQ的數據源藥酒必須實現IEnumerable<T>接口,數組隱士支持這個接口,number叫作查詢變量,它存儲了一個查詢表達式
注意,聲明查詢變量並不會執行查詢,真正的執行查詢延遲到了Foreach語句中。
查詢表達式必須以From子句開頭,以select或Group 子句結束。第一個from子句和最後一個select子句或Group子句之間,能夠包含一個
或多個where子句、let子句、join子句、orderBy子句和Group子句,甚至還能夠是From子句,它包括8個基本子句,具體以下:
From子句
建立一個LINQ表達式必需要以from子句開頭。
例子1:單個from子句
static void Main(string[] args) { string[] values = { "中","日本","韓國","美國"}; var sum = from a in values //第一個匹配的字符 where a.IndexOf("國")>0 select a; foreach (var item in sum) { Console.WriteLine(item); Console.ReadKey(); } }
在這個LINQ表達式的from子句中,a叫作範圍變量,values是數據源。a的做用於存在於當前的LINQ表達式,表達式之外不能訪問這個變量,
where 用來篩選元素,select 用於輸出元素。這裏的範圍變量a和foreach語句中的隱士變量item均可以由編輯器推斷出其類型。
例子2複合from子句
在查詢數據源中,元素的屬性是一個集合時,可使用複合from子句對這個屬性集合查詢
static void Main(string[] args) { //【1】建立數據源 List<Custom> cut = new List<Custom>() { new Custom { name="杜偉",Age=30,Table=new List<string> { "1316685*****","1764408*****"} }, new Custom { name="於海燕",Age=35,Table=new List<string> {"123456****","125458****" } } }; //【2】建立linq表達式 var telphone = from a in cut from tel in a.Table //由於電話又是一個集合。 where tel.IndexOf("1316685*****") > -1 select a; //【3】查詢 foreach (var item in telphone) { Console.WriteLine("姓名{0},年齡{1}",item.name,item.Age); //Table是一個泛型集合,也須要循環輸出 foreach (var tel in item.Table) { Console.WriteLine("電話:{0}",tel); } } Console.ReadKey(); }
多個from子句
static void Main(string[] args) { int[] a = { 12,4,53,48,11}; int[] b = { 22,55,8,99,16}; var intsum = from query in a from query2 in b //至關於一個嵌套查詢 select query + query2; foreach (var item in intsum) { Console.WriteLine(item); //輸出的結果不是對應的相加,而是a數組中每一個元素根b數組中每一個元素相加 //34 67 20 111 28 26 59 ........等 } Console.ReadKey(); }