LINQ查询from子句
LINQ查询表达式必须包含from子句,且以from子句开头。如果该查询表达式还包含子查询,那么子查询表达式也必须以from子句开头。from子句指定查询操作的数据源和范围变量。其中,数据源不但包括查询本身的数据源,而且还包括子查询的数据源。范围变量一般用来表示源序列中的每一个元素。下面的代码实例就演示了一个简单的查询操作,该查询操作从values数组中查询小于3的元素。其中,v为范围变量,values是数据源。
int[] values = {0,1,2,3,4,5,6,7,8,9}; var value = from v in values where v < 3 select v;
注意:from子句指定的数据源的类型必须为IEnumerable、IEnumerable<T>或前两者的派生类型。
1.数据源
在from子句中,如果数据源(如List<int>、List<string>等)实现了IEnumerable<T>,那么编译器可以自动推断出范围变量的类型。在下面的代码实例中,from子句的范围变量v的类型为string类型。该查询操作从values泛型列表中查询“000”的字符串。
List<string> values = … ///初始化代码已经省略 var value = from v in values where v == "000" select v;
然而,如果数据源的类型是非泛型IEnumerable类型(如ArrayList等)时,则必须显式指定范围变量的数据类型。在下面的代码实例中,from子句的数据源为ArrayList类型,范围变量u的类型必须显示指定为UserInfo类型。该查询操作从values动态数组中查询ID属性的指小于8的元素。
ArrayList values = new ArrayList(); for (int i = 1; i < 10; i++) { values.Add(new UserInfo(i, "User0" + i.ToString(),"User0" + i.ToString() + "@web.com")); } var value = from UserInfo u in values where u.ID < 8 select u;
上述的代码实例执行之前和之后,数据源和查询操作的结果对比如表所示。
表 数据源和查询操作的结果对比(1)
数据源 |
查询表达式/操作 |
查询结果 |
说明 |
values(包含9个元素,元素的ID属性的值分别为1、2、3、4、5、…、9) |
from UserInfo u in values where u.ID < 8 select u |
value(包含7个元素,元素的ID属性的值分别为1、2、3、4、5、…、7) |
|
2.单个from子句查询
顾名思义,在一个LINQ查询表达式中,若该查询表达式只包含一个from子句,则称该查询为单个from子句查询。单个from子句查询往往使用一个数据源。
下面的代码实例中的SinlgeFromQuery()函数首先创建数据类型为List<UserInfo>的数据源users,然后使用from子句查询ID值小于3的用户,最后使用foreach语句输出查询的结果。
private void SinlgeFromQuery() { ///构建数据源 List<UserInfo> users = new List<UserInfo>(); for (int i = 1; i < 10; i++) { users.Add(new UserInfo(i, "User0" + i.ToString(),"User0" + i.ToString() + "@web.com")); } ///查询ID值小于3的用户 var value = from u in users where u.ID < 3 select u; ///显示查询结果 foreach (var v in value){Response.Write(v.Username + "</br>");} }
运行上述实例代码,在IE浏览器中查看单个from子句查询的结果,如图所示。
3.复合from子句查询
在一些情况下,数据源(本身是一个序列)的元素还包含子数据源(如序列、列表等)。如果要查询子数据源中的元素,则需要使用复合from子句。下面的代码实例中的ComplexFromQuery()函数演示了复合from子句查询的方法,具体步骤说明如下。
(1)创建数据类型为List<UserInfo>的数据源users。其中,users元素的AliasName属性的数据类型是List<string>,即该属性的值也是一个子数据源。
(2)使用复合from子句查询ID值小于3、且别名包含字符串“1”的用户。第一个from子句查询users数据源,第二个from子句查询users.AliasName数据源。
(3)使用foreach语句输出查询的结果。
private void ComplexFromQuery() { ///构建数据源 List<UserInfo> users = new List<UserInfo>(); for (int i = 1; i < 10; i++) { users.Add(new UserInfo(i, "User0" + i.ToString(), "User0" + i.ToString() + "@web.com", new List<string>{"Alias0" + i.ToString()} )); } ///查询ID值小于3的用户,且别名包含字符串“1” var value = from u in users from an in u.AliasName where u.ID < 3 && an.ToString().IndexOf("1") > -1 select u; ///显示查询结果 foreach (var v in value) { Response.Write(v.Username + "</br>"); } }
运行上述实例代码,在IE浏览器中查看复合from子句查询的结果,如图所示。
4.多个from子句查询
若LINQ查询表达式包含两个或两个以上的独立数据源时,那么可以使用多个from子句查询所有数据源中的数据。下面的代码实例中的MultiFromQuery()函数演示了多个from子句查询的方法,具体步骤说明如下。
(1)创建数据类型为List<UserInfo>的数据源ausers和busers。
(2)第一个from子句查询ausers数据源中ID值小于3的用户,第二个from子句查询busers数据源中ID值大于5的用户。最后获取查询结果元素的Username和Email属性的值。
(3)使用foreach语句输出查询的结果。
private void MultiFromQuery() { ///构建数据源 List<UserInfo> ausers = new List<UserInfo>(); List<UserInfo> busers = new List<UserInfo>(); for (int i = 1; i < 10; i++) { ausers.Add(new UserInfo(i,"AUser0" + i.ToString(),"AUser0" + i.ToString() + "@web.com")); busers.Add(new UserInfo(i,"BUser0" + i.ToString(),"BUser0" + i.ToString() + "@web.com")); } ///共包含两个查询,一个查询ID值小于3的用户,另外一个查询ID值大于5的用户 var value = from au in ausers where au.ID < 3 from bu in busers where bu.ID > 5 select new {au.Username, bu.Email}; ///显示查询结果 foreach (var v in value) { Response.Write(v.Username + " " + v.Email + "</br>"); } }
运行上述实例代码,在IE浏览器中查看多个from子句查询的结果,如图所示。
来源:http://blog.csdn.net/linqmail/article/details/2295725
加支付宝好友偷能量挖...