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

加支付宝好友偷能量挖...


评论(0)网络
阅读(125)喜欢(0)asp.net-linq