Linq查詢表達式包含8個常用的子句:from、where、select、join、into、orderby、group、let。我們來看看詳細的說明。
from: 指定查詢操作的數據源和范圍變量
where: 篩選元素的邏輯條件,一般由邏輯運算符("與","或")組成
select: 指定查詢結果的類型和表現形式
orderby: 對查詢結果進行排序,可以升序也可以降序
group: 對查詢結果進行分組
into: 提供一個臨時標識符,該標識符可以充當對join、group或select子句的結果的引用
join: 連接多個查詢操作的數據源
let: 引入用於存儲查詢表達式中的子表達式結果的范圍變量
Linq的查詢表達式必須以 from子句開頭,並且以select或group子句結束。在第一個from子句和最后一個select或group子句之間,查詢表達式可以包含一個或多個where、orderby、group、join、let子句,甚至from子句。
另外,join和group子句還可以使用into子句指定臨時標識符號。我們來看看下面的一個簡單的查詢表達式:
1 private void LinqTest() 2 { 3 int[] values = {0,1,2,3,4,5,6,7,8,9}; 4 5 var result = from v in values 6 where v > 3 7 select v; 8 }
下面我們就來逐一的講解一下這8個子句的用法。
1、from子句
linq查詢表達式必須包含from子句且以from子句開頭,如果該查詢中包含子查詢,那么子查詢也必須以from子句開頭。from子句指定查詢操作的數據源和范圍變量,數據源包括本身和子查詢的數據源,范圍變量表示源序列中的每一個元素。
上面的簡單查詢例子中,是存數組values中查詢出大於3的元素,其中values就是數據源,v就是變量范圍,即表示values中的每一個元素。
值得注意的是from指定的數據源類型必須為IEnumerable、IEnumerable<T>或者這兩者的派生類型。
a、數據源
在from子句中,如果數據源實現了IEnumerable<T>,那么vs編譯器就能夠自動推斷出范圍變量的類型。
1 private void LinqTest() 2 { 3 List<string> values = new List<string> {"IT少年","成都","18","boy","pro"}; 4 5 var result = from v in values 6 where v == "IT少年" 7 select v; 8 }
上面的代碼中,范圍變量V的類型就是string類型,該查詢操作是查詢出內容為"IT少年"的字符串。
b、單個的from子句查詢
在一個Linq查詢中只包含一個from子句的查詢我們就稱為單個的from子句查詢。我們來看看單個的from查詢:
1 private void SingleFromQuery() 2 { 3 //准備數據源創建一個泛型列表元素類型為UserBaseInfo 4 List<UserBaseInfo> users = new List<UserBaseInfo>(); 5 6 for (int i = 1; i < 10; i++) 7 { 8 users.Add(new UserBaseInfo(i, "user0" + i.ToString(), "user0" + i.ToString() + "@web.com")); 9 } 10 11 12 //以下是創建Linq查詢 13 var result = from u in users 14 15 where u.ID < 3 16 select u; 17 18 foreach (var u in result) 19 { 20 Response.Write("ID:" + u.ID + "</br>" + "username:" + u.UserName + "</br>"); 21 } 22 }
我們查詢出id小於3個元素,然后循環輸入元素的id和username。我們看看輸出結果:
c、復合from子句查詢
在一些復雜的情況下,數據源的元素還包含子數據源。如果我們要查詢子數據源中的數據,就需要用復合from子句。下面的ComplexFromQuery方法函數演示了復合from子句查詢方法。
(1)創建數據類型為List<UserBaseInfo>的數據源users,其中users元素中AliasName屬性的數據類型為List<string>,即該屬性的值也是一個子數據源。
UserBaseInfo類如下:
1 public class UserBaseInfo 2 { 3 private List<string> aliasname; 4 private int id; 5 private string email; 6 private int roleid; 7 private string username; 8 9 public UserBaseInfo(int Id, string userName, string email, List<string> aliasName) 10 : this(Id, userName, email) 11 { 12 13 this.aliasname = aliasName; 14 } 15 16 public UserBaseInfo(int Id, string userName, string email) 17 { 18 this.id = Id; 19 this.username = userName; 20 this.email = email; 21 } 22 public UserBaseInfo(int Id, string userName, string email, int roleId) 23 : this(Id, userName, email) 24 { 25 this.roleid = roleId; 26 } 27 28 public UserBaseInfo(int Id, string userName, string email, int roleId, List<string> aliasName) 29 : this(Id, userName, email, roleId) 30 { 31 this.aliasname = aliasName; 32 } 33 34 public List<string> AliasName 35 { 36 get { return this.aliasname; } 37 set { this.aliasname = AliasName; } 38 } 39 public int ID 40 { 41 get { return this.id; } 42 set 43 { 44 this.id = ID; 45 } 46 } 47 48 public string Email 49 { 50 get { return this.email; } 51 set { this.email = Email; } 52 } 53 54 public int RoleId 55 { 56 get { return this.roleid; } 57 set { this.roleid = RoleId; } 58 } 59 60 public string UserName 61 { 62 get { return this.username; } 63 set { this.username = UserName; } 64 } 65 }
(2)、使用復合from子句查詢出id小於3且aliasname包含1的用戶。第一個from子句查詢users數據源,第二個from子句查詢users.AliasName數據源。
1 private void ComplexFromQuery() 2 { 3 //准備數據源創建一個泛型列表元素類型為UserBaseInfo 4 List<UserBaseInfo> users = new List<UserBaseInfo>(); 5 6 for (int i = 1; i < 10; i++) 7 { 8 users.Add(new UserBaseInfo(i, "user0" + i.ToString(), "user0" + i.ToString() + "@web.com",new List<string>{"AliasName0"+i.ToString()})); 9 } 10 11 12 //以下是查詢id值小於3的用戶且別名包含字符串"1" 13 var result = from u in users 14 from al in u.AliasName 15 where u.ID < 3 && al.ToString().IndexOf("1")>1 16 select u; 17 18 foreach (var u in result) 19 { 20 Response.Write("ID:" + u.ID + "</br>" + "username:" + u.UserName + "</br>"); 21 } 22 }
我們看看查詢結果:
d、多個from子句查詢
如果Linq中包含兩個或兩個以上的獨立數據源,我們可以使用多個from子句查詢所有數據源中的數據。下面看看多個from子句查詢的方法:
(1)創建數據類型為List<UserBaseInfo>的數據源usersA,usersB。
(2)第一個from查詢出usersA中ID小於3的用戶,第二個from查詢出usersB中ID大於5的用戶。
private void MultFromQuery() { List<UserBaseInfo> usersA = new List<UserBaseInfo>(); List<UserBaseInfo> usersB = new List<UserBaseInfo>(); for (int i = 1; i < 10; i++) { usersA.Add(new UserBaseInfo(i, "user0" + i.ToString(), "user0" + i.ToString() + "@web.com", new List<string> { "AliasName0" + i.ToString() })); usersB.Add(new UserBaseInfo(i, "user0" + i.ToString(), "user0" + i.ToString() + "@web.com", new List<string> { "AliasName0" + i.ToString() })); } //以下包含連個查詢,一個查詢ID小於3的用戶,一個查詢ID大於5的用戶 var result = from ua in usersA where ua.ID<3 from ub in usersB where ub.ID>5 select new{ua.ID,ub.UserName}; foreach (var u in result) { Response.Write("ID:" + u.ID + "</br>" + "username:" + u.UserName + "</br>"); } }
運行結果如下: