Linq专题之Linq查询from子句

时间:2021-07-08 04:20:51

  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子句指定临时标识符号。我们来看看下面的一个简单的查询表达式:

 private void LinqTest()
{
int[] values = {,,,,,,,,,}; var result = from v in values
where v >
select v;
}

下面我们就来逐一的讲解一下这8个子句的用法。
1、from子句

  linq查询表达式必须包含from子句且以from子句开头,如果该查询中包含子查询,那么子查询也必须以from子句开头。from子句指定查询操作的数据源和范围变量,数据源包括本身和子查询的数据源,范围变量表示源序列中的每一个元素。

上面的简单查询例子中,是存数组values中查询出大于3的元素,其中values就是数据源,v就是变量范围,即表示values中的每一个元素。

  值得注意的是from指定的数据源类型必须为IEnumerable、IEnumerable<T>或者这两者的派生类型。

a、数据源

      在from子句中,如果数据源实现了IEnumerable<T>,那么vs编译器就能够自动推断出范围变量的类型。

 private void LinqTest()
{
List<string> values = new List<string> {"IT少年","成都","","boy","pro"}; var result = from v in values
where v == "IT少年"
select v;
}

上面的代码中,范围变量V的类型就是string类型,该查询操作是查询出内容为"IT少年"的字符串。
   b、单个的from子句查询

  在一个Linq查询中只包含一个from子句的查询我们就称为单个的from子句查询。我们来看看单个的from查询:

  private void SingleFromQuery()
{
//准备数据源创建一个泛型列表元素类型为UserBaseInfo
List<UserBaseInfo> users = new List<UserBaseInfo>(); for (int i = ; i < ; i++)
{
users.Add(new UserBaseInfo(i, "user0" + i.ToString(), "user0" + i.ToString() + "@web.com"));
} //以下是创建Linq查询
var result = from u in users where u.ID <
select u; foreach (var u in result)
{
Response.Write("ID:" + u.ID + "</br>" + "username:" + u.UserName + "</br>");
}
}

我们查询出id小于3个元素,然后循环输入元素的id和username。我们看看输出结果:
Linq专题之Linq查询from子句

  c、复合from子句查询

  在一些复杂的情况下,数据源的元素还包含子数据源。如果我们要查询子数据源中的数据,就需要用复合from子句。下面的ComplexFromQuery方法函数演示了复合from子句查询方法。

(1)创建数据类型为List<UserBaseInfo>的数据源users,其中users元素中AliasName属性的数据类型为List<string>,即该属性的值也是一个子数据源。

UserBaseInfo类如下:

   public class UserBaseInfo
{
private List<string> aliasname;
private int id;
private string email;
private int roleid;
private string username; public UserBaseInfo(int Id, string userName, string email, List<string> aliasName)
: this(Id, userName, email)
{ this.aliasname = aliasName;
} public UserBaseInfo(int Id, string userName, string email)
{
this.id = Id;
this.username = userName;
this.email = email;
}
public UserBaseInfo(int Id, string userName, string email, int roleId)
: this(Id, userName, email)
{
this.roleid = roleId;
} public UserBaseInfo(int Id, string userName, string email, int roleId, List<string> aliasName)
: this(Id, userName, email, roleId)
{
this.aliasname = aliasName;
} public List<string> AliasName
{
get { return this.aliasname; }
set { this.aliasname = AliasName; }
}
public int ID
{
get { return this.id; }
set
{
this.id = ID;
}
} public string Email
{
get { return this.email; }
set { this.email = Email; }
} public int RoleId
{
get { return this.roleid; }
set { this.roleid = RoleId; }
} public string UserName
{
get { return this.username; }
set { this.username = UserName; }
}
}

(2)、使用复合from子句查询出id小于3且aliasname包含1的用户。第一个from子句查询users数据源,第二个from子句查询users.AliasName数据源。

 private void ComplexFromQuery()
{
//准备数据源创建一个泛型列表元素类型为UserBaseInfo
List<UserBaseInfo> users = new List<UserBaseInfo>(); for (int i = ; i < ; i++)
{
users.Add(new UserBaseInfo(i, "user0" + i.ToString(), "user0" + i.ToString() + "@web.com",new List<string>{"AliasName0"+i.ToString()}));
} //以下是查询id值小于3的用户且别名包含字符串"1"
var result = from u in users
from al in u.AliasName
where u.ID < && al.ToString().IndexOf("")>
select u; foreach (var u in result)
{
Response.Write("ID:" + u.ID + "</br>" + "username:" + u.UserName + "</br>");
}
}

我们看看查询结果:
Linq专题之Linq查询from子句

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 = ; i < ; 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< from ub in usersB where ub.ID>
select new{ua.ID,ub.UserName}; foreach (var u in result)
{
Response.Write("ID:" + u.ID + "</br>" + "username:" + u.UserName + "</br>");
}
}

运行结果如下:
Linq专题之Linq查询from子句

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

  1. Linq专题列表

    什么是Linq? Linq(Language-Integrated Query),即语言集成查询.是微软的一项新技术,能够将查询功能直接引入.NET Framework3.5 所支持的编程语言(C#, ...

  2. Linq to SQL 语法查询&lpar;链接查询,子查询 &amp&semi; in操作 &amp&semi; join,分组统计等&rpar;

    Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c i ...

  3. LINQ中的一些查询语句格式

    LINQ的基本格式如下所示:var <变量> = from <项目> in <数据源> where <表达式> orderby <表达式> ...

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

    这里是原文出处: 简单的概括LINQ LINQ是Language-Integrated Query的缩写,是C# 3.0和VB 9.0中新加入的语言特性,可以在编程时使用内置的查询语言进行基于集合的操 ...

  5. Linq 多表连接查询join

    在查询语言中,通常需要使用联接操作.在 LINQ 中,可以通过 join 子句实现联接操作.join 子句可以将来自不同源序列,并且在对象模型中没有直接关系(数据库表之间没有关系)的元素相关联,唯一的 ...

  6. LINQ(语言集成查询)

    LINQ,语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展.它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作 ...

  7. LINQ驱动数据的查询功能

    一.LINQ概念 LINQ是微软在.NetFramework3.5中新加入的语言功能,在语言中以程序代码方式处理集合的能力. 1.1 LINQ VS 循环处理 在我刚工作时候,对于集合对象的处理一般是 ...

  8. Linq to 泛型集合查询集合包括大写M和年龄小于等于18

    #region Linq to 泛型集合查询集合包括大写M和年龄小于等于18            //List<Student> list = new List<Student&g ...

  9. LINQ——语言级集成查询入门指南&lpar;1&rpar;

    本文主要是对语言级集成查询或简称为LINQ做一个介绍,包括LINQ是什么,不是什么,并对它在语言特性方面做一个简短的回顾,然后举一些使用LINQ的实际例子进行说明. 语言级集成查询是什么? 在我过去写 ...

随机推荐

  1. 浅析MySQL基于ROW格式的二进制日志

    上文分析的二进制日志实际上是基于STATEMENT格式的,下面我们来看看基于ROW格式的二进制日志,毕竟,两者对应的binlog事件类型也不一样,同时,很多童鞋反映基于ROW格式的二进制日志无法查到原 ...

  2. C和指针 第十六章 标准函数库

    字符串转换: long int strtol(char const *string, char **unused, int base); 将字符串转换为数值形式,遇到非法字符停止,如果stop不是NU ...

  3. Python基础篇【第5篇】&colon; Python内置模块&lpar;二&rpar;

    内置模块 1. OS os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell ...

  4. composer--------------今天遇到几个奇葩问题,记录一下

    1.就是composer跟xdebug有冲突,每次用composer命令的时候都要报xdebug的错误,其实这个只要你去php的配置文件里面将xdebug注释掉就可以了,但是我注释掉了以后还是不行.找 ...

  5. php输出csv文件 简单实现

    <?php $list = array ( "George,John,Thomas,USA", "James,Adrew,Martin,USA", ); ...

  6. sql replace into 与 insert into

    sql replace into用法详细说明 REPLACE的运行与INSERT很相似.只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则 ...

  7. 转载&colon; pyExcelerator&lpar;Python操作Excel内库&rpar;API 文档

    1.pyExcelerator 主要通过俩个Object操作Excel: Workbook 和Worksheet2.pyExcelerator 读取Excel文件 parase_xls(filenam ...

  8. vs2010-error LNK1123&colon; failure during conversion to COFF&colon; file invalid or corrupt

    在项目上右键->Properties-> configuration Properties->Enable Incremental Linking(设置为No). ref: Link ...

  9. C&num; ORM—Entity Framework 之Database first(数据库优先)&amp&semi;Model First(模型优先)(一)

    一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...

  10. BZOJ5262&lpar;容斥&rpar;

    题目描述 听着自己美妙的曲子,小Z进入了梦乡.在梦中,小Z仿佛又回到了自己纵横考场的年代.在梦中,小Z参加了一场 考试,这场考试一共有n道题,每道题的最终得分都是一个大于等于0的整数.然而醒来后,小Z ...