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>");
            }
        }

运行结果如下:

时间: 2024-11-10 01:25:44

Linq专题之Linq查询from子句的相关文章

LINQ中的一些查询语句格式

LINQ的基本格式如下所示:var <变量> = from <项目> in <数据源> where <表达式> orderby <表达式> LINQ 基本子句from查询子句——基础后面跟随着项目名称和数据源示例代码如下:var str = from lq in str select lq; 其中select语句指定了返回到集合变量中的元素是来自哪个数据源的 from查询子句——嵌套查询可以在from子句中嵌套另一个from子句即可,示例代码如下

用LINQ在集合中查询特定对象

这里是原文出处: 简单的概括LINQ LINQ是Language-Integrated Query的缩写,是C# 3.0和VB 9.0中新加入的语言特性,可以在编程时使用内置的查询语言进行基于集合的操作. List<User> userList = GetUserList(); var userWithOddId = from u in userList where u.UserID % 2 == 1 select u; foreach (User u in userWithOddId) {

Linq的连表查询

Linq做连表查询,可以先查出A.B表,然后再join A.B表,操作A.B组合的匿名表X var table1=from r in shiti.a() from y in r.years where y>2010 select new { year=y, name=r.FirstName }; var table2=from t in shiti.b() from y in t.years where y>2010 select new { year=y, name=t.name } 然后根

LINQ驱动数据的查询功能

一.LINQ概念 LINQ是微软在.NetFramework3.5中新加入的语言功能,在语言中以程序代码方式处理集合的能力. 1.1 LINQ VS 循环处理 在我刚工作时候,对于集合对象的处理一般是采用循环这个集合处理,在处理实值类型上这样做效率还行,但是如果集合内是引用类型,使用LINQ就方便的多,例如一个程序要计算课程的总分和平均分,实体分别是Student和StudentScore 类的申明如下: /// <summary> /// 学生实体 /// </summary>

LinQ To Objects 高级查询方法

什么是LinQ To Objects? 用一个例子解释,首先定义一个数组,查询数组中的最大值: int[] arr = { 123, 2, 3, 45, 654, 2324, 897, 56, 6554, 4, 3, 6, 8, 434 }; 旧的方法: int max=0 ; foreach(int a in arr) { if(a>=max) max=a; } Console.Write("最大值:"+ max); LinQ To Objects方法: Console.Wri

Linq 中 表连接查询

1 public void Test(){ 2 3 var query = from a in A join b in B on A.Id equals B.Id into c 4 from d in c.DefaultIfEmpty() 5 select d; 7 } Linq 中 表连接查询,布布扣,bubuko.com

Dynamic Linq 不支持模糊查询...

转发... http://www.blogjava.net/jvict/articles/246939.html 中文的实在是找不到了,在MS的官方BBS上找到了个链接 这里放出核心代码,很容易看懂,简单就是美!  1         searchPredicate = PredicateExtensions.True<UserT_TractInfo>(); 2         foreach (string key in nvcParam) 3         { 4            

LINQ——语言级集成查询入门指南(1)

本文主要是对语言级集成查询或简称为LINQ做一个介绍,包括LINQ是什么,不是什么,并对它在语言特性方面做一个简短的回顾,然后举一些使用LINQ的实际例子进行说明. 语言级集成查询是什么? 在我过去写的大多数文章中,即使是最早的一篇文章(数据库独立的数据访问),也总是涉及到访问和操纵数据,通常,数据是存储在数据库中的,但也有其他种类访问和操纵数据如数据文件,事件日志,注册表等的方式,查询和操纵数据是许多应用程序通用的部分. LINQ(经常听到有人发音与link一样)在数据访问方面向前推进了一大步

C#程序中使用LINQ to XML来查询XML格式数据的实例

LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework 编程语言中处理 XML.它将 XML 文档置于内存中,这一点很像文档对象模型 (DOM). 您可以查询和修改 XML 文档,修改之后,可以将其另存为文件,也可以将其序列化然后通过网络发送. 但是,LINQ to XML 与 DOM 不同: 它提供一种新的对象模型,这是一种更轻量的模型,使用也更方便,这种模型利用了 VisualC# 2008 在语言方面的改进.LINQ to X