Linq专题之Linq查询from子句

Linq专题之Linq查询from子句

  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>");
            }
        }
复制代码

运行结果如下:

每天早上敲醒自己的不是闹钟,是夢想!

猜你喜欢

转载自blog.csdn.net/weixin_42339460/article/details/80665455