每个LINQ查询都以from子句开始,from子句包括以下两个功能。

  • 指定查询将采用数据源。
  • 定义一个本地变量,表示数据源中单个元素

            string[] values = { "中国", "日本", "美国", "菲律宾", "越南" };

            //查询包含“国”的字符串
var valueQuery = from v in values
where v.IndexOf("国") > 0
select v; foreach (var v in valueQuery)
{
Console.WriteLine("{0,1}", v);
}

在这个LINQ表达式的from子句中,v叫做范围变量,values是数据源。v的作用域存在于当前的LINQ表达式,表达式以外不能访问这个变量。where用来筛选元素,select用于输出元素。这里的范围变量v,和foreach语句中得隐式变量v都可以由编译器推断出其类型。
运行的结果如下:

中国
美国

1、如何使用LINQ

LINQ作为一种数据查询编码方式,本身并不是独立的开发语句,也不能进行应用程序开发。在.NET3.5中,可以在C#中集成LINQ查询代码。在任何源代码文件中,要使用LINQ查询功能,必须引用System.Linq命名空间。使用LINQ to XML要引用System.Xml.Linq命名空间,使用LINQ to ADO.NET要引用System.Data.Linq命名空间。


2、LINQ查询表达式

查询表达式关键字:

    from:指定要查找的数据源以及范围变量,多个from子句则表示从多个数据源中查找数据

    select: 指定查询要返回的目标数据,可以指定任何类型,甚至是匿名类型

    where: 指定元素的筛选条件,多个where子句则表示了并列关系,必须全部都满足才能入选

    orderby: 指定元素的排序字段和排序方式,当有多个排序字段时,有字段顺序确定主次关系,可以指定升序和降序两种排序方式

    group: 指定元素的分组字段

    join: 指定多个数据源的关联方式


2.1 用from子句指定数据源

  每个LINQ查询语句都是以from子句开始,from子句包括以下两个功能:

    ●指定查询将采用的数据源

    ●定义一个本地变量,表示数据源中的单个元素

  如: from localval in datasource

  一般情况下,不用为from子句的localval元素指定数据类型,编译器会根据数据源类型为它分配合适的类型,通常为IEnumerable<T>中的类型T。例如,下面的val会被分配为int类型

    int[] arr =  {1,2,3,4,5};

    var query = from val in arr select val; 

  特殊情况下,开发人员需要为本地变量指定数据类型,比如上面的例子中,如果希望将arr中的元素作为object类型进行处理,而不是int类型,需要指定val2为object类型,因为arr中元素是int类型,数据object类型的子类型,所以可以直接转换,如下:

    int[] arr =  {1,2,3,4,5};

    var query = from object val2 in arr select val2;

  值得注意的是,编译器并不会检查本地变量的具体类型,所以即使指定类型不正确,编译器也不会报错,但是在下面使用该查询时,会在运行时进行类型检查,从而产生异常。


2.2 用select子句指定目标数据

  LINQ查询表达式必须以select或者group子句结束。select子句中要选择的目标数据不仅可以是数据源中的元素,还可以是该元素的不同操作结果,包括属性、方法、运算,如下面两个例子:   

var query2 =
from val in arr
select val.Name;
foreach(string item in query2)
{
Console.Write("{0}, ",item);
}
Console.WriteLine();
var query3 =
from val in arr
select val.Name.Length;
foreach (int item in query3)
{
Console.Write("{0}, ", item);
}

  在某些特殊的场合,往往查询结果只是临时使用一下,而且查询结果的数据包括很多字段,并非简单的一个属性、方法返回值等。在LINQ中,可以在select子句中使用匿名类型来解决这个问题。如query4中的select子句通过匿名类型定义返回结果,因为编码无法使用匿名类型,所以在foreach只能通过var(可变类型)关键字让编译器自动判断查询中元素类型。

            var query4 =
from val in arr
select new { val.Name, val.Age, NameLen = val.Name.Length};
foreach(var item2 in query4)
{
Console.WriteLine(item2);
}

2.3 用where子句指定筛选条件

  作用:指定查询的过滤条件

  格式:where Expression

  int[] ary = {1,2,3,4,5,6,7,8,9,10,11,12};

  var query =

        from val in ary

        where (val > 5) && (val < 10)

        select val;


2.4 用orderby子句进行排序

  作用:对查询结果进行排序

  格式: orderby element [sortType]

  其中,sortType是可选参数,表示排序类型,包括升序(ascending)和降序(descending)两个参数,默认为升序。

            int[] ary = { 9,54,32,1,67,43,0,9,7,4,9,2,23,66,61};
var query5 =
from val in ary
orderby val
select val;
foreach(var item in query5)
{
Console.Write("{0} ",item);
}
Console.WriteLine();
Console.WriteLine();
var query6 =
from val in ary
orderby val descending
select val;
foreach (var item in query6)
{
Console.Write("{0} ", item);
}

结果是:

  

  在LINQ中,orderby可以同时指定多个排序元素,也可以为每个排序元素指定独立的排序方式。orderby后的第一个排序元素为主要排序,第二个为次要排序,依次类推。如下面例子,先按照姓名字符数量进行升序排列,再按照年龄降序排列。

            var query7 =
from val in arr
orderby val.Name.Length ascending, val.Age descending
select val;
foreach(var item in query7)
{
Console.WriteLine(item);
}

结果:


2.5 用group子句进行分组

  作用:对数据进行分组

  格式:group element by key

            var query8 =
from val in arr
group val by val.Xingbie;
foreach(var grp in query8)
{
Console.WriteLine(grp.Key);
foreach(var st in grp)
{
Console.WriteLine("\t{0}",st);
}
}

  有时候需要对分组结果进行排序、在查询等操作,这时候就需要使用into 关键字将group查询结果存在一个临时变量中,并且必须使用新的select或者group子句对其进行查询,也可使用orderby进行排序,where进行过滤等等,into的语句格式如下

    group element by key into tmpgrp

  其中,tmpgrp就是临时变量,用来临时保存group产生的结果,提供后面的查询操作。

            var query9 =
from val in arr
group val by val.Age into stgrp
orderby stgrp.Key descending
select stgrp;
foreach(var st in query9)
{
Console.WriteLine("{0}岁的学生:",st.Key);
foreach(var stu in st)
{
Console.WriteLine("\t{0}",stu);
}
}


2.6 用join子句进行关联

  join子句实现联接操作,将来自不同源序列,并且在对象模型中没有直接关系的元素相关联,唯一的要求就是每个源中的元素需要共享某个可以进行比较,以判断是否相等的值。

  join子句可以实现3种类型的联接: 内部联接、分组联接、左外部联接。


2.6.1 用join子句进行内部联接

  格式: join element in datasource on exp1 equals exp2

  datasource 表示数据源,它是联接要使用的第二个数据集,element 表示存储datasource中元素的本地变量,exp1 和 exp2 表示两个表达式,它们具有相同的数据类型,可以用equals进行比较,如果exp1 和 exp2 相等,则当前元素将添加到查询结果中。

            int[] intarray1 = { 5,15,25,30,33,40};
int[] intarray2 = { 10,20,30,40,50,60,70,80,90,100};
var query12 =
from val1 in intarray1
join val2 in intarray2 on val1 % 5 equals val2 % 15
select new { VAL1 = val1,VAL2 = val2};
foreach(var val in query12)
{
Console.WriteLine(val);
}
 
 

2.6.2 用join子句进行分组联接

  格式:join element in datasource on exp1 equals exp2 into grpname

  into 关键字表示将这些数据分组并保存到grpname中,grpname是保存一组数据的集合。

  分组联接产生分层的数据结果,它将第一个集合中的每一个元素与第二个集合中的一组相关元素进行配对。值得注意的是,即使第一个集合中的元素在第二个集合中没有配对的元素,也会为它产生一个空的分组对象。

            var query13 =
from val1 in intarray1
join val2 in intarray2 on val1 % 5 equals val2 % 15 into grpName
select new { VAL1 = val1, VAL2 = grpName};
foreach(var val in query13)
{
Console.Write("{0}: ",val.VAL1);
foreach(var obj in val.VAL2)
{
Console.Write("{0} ",obj);
}
Console.WriteLine();
}

请比较query12 和 query13 的运行结果的区别。


2.6.3 用join子句进行左外部联接

  左外部联接返回第一个集合元素的所有元素,无论它是否在第二个集合中有相关元素。在LINQ中,通过对分组联接的结果调用DefaultEmpty()来执行左外部联接。

            var query14 =
from val1 in intarray1
join val2 in intarray2 on val1 % 5 equals val2 % 15 into grpName
from grp in grpName.DefaultIfEmpty()
select new { VAL1 = val1 , VAL2 = grp};
foreach(var val in query14)
{
Console.WriteLine(val);
}

2.7 使用let子句扩展范围变量

  用于创建查询自身的范围变量

string[] strings ={
"I am a new Student.",
"You are a talent"
}; var query = from sentences in strings
let words = sentences.Split(' ')
from word in words
let w = word.ToLower()
where w[0] == 'a' || w[0] == 'e' || w[0] == 'i' || w[0] == 'o' ||
w[0] == 'u'
select word; foreach (var word in query)
{
Console.Write(word + ",");
}

  需求:将字符串数组中的两句英文语句中所有的元音字母打头的单词输出到控制台

  分析:首先遍历字符串数组中的每个字符串,用let子句创建查询自身的范围变量words,并调用Split(' ')方法,将每个字符串中以空格分割为单词存入words变量中,然后再次使用let子句创建查询自身的范围变量word,并调用ToLower()方法,将每个单词都变为小写,最后筛选出首字母为元音的单词进行返回。

PS:本文完整代码来自:http://www.cnblogs.com/crandy/p/4546126.html

【总结】LINQ查询基本操作列表的更多相关文章

  1. Linq查询基本操作

    摘要:本文介绍Linq查询基本操作(查询关键字) - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 ...

  2. C#中Linq查询基本操作

    摘要:本文介绍Linq查询基本操作(查询关键字) - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 ...

  3. Linq 查询基本操作

    - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 - let 子句 - 复合from子句 - 在某 ...

  4. [转载]EF或LINQ 查询时使用IN并且根据列表自定义排序方法

    原文地址:EF或LINQ 查询时使用IN并且根据列表自定义排序方法作者:李明川 EF和LINQ改变了原有的手写SQL时期的一些编码方法,并且增强了各数据库之间的移植性简化了开发时的代码量和难度,由于很 ...

  5. Linq EF 根据字符列表排序或List根据列表排序以及Linq查询类型转换

    //model.BBSCategoryIDList=>{10,23,12}或者{1,3,2} //model.BBSCategoryIDs=>1,3,2或者10,23,12 //SqlFu ...

  6. C#基础:LINQ 查询函数整理

    1.LINQ 函数   1.1.查询结果过滤 :where() Enumerable.Where() 是LINQ 中使用最多的函数,大多数都要针对集合对象进行过滤,因此Where()在LINQ 的操作 ...

  7. Linq专题之Linq查询from子句

    Linq查询表达式包含8个常用的子句:from.where.select.join.into.orderby.group.let.我们来看看详细的说明.      from:      指定查询操作的 ...

  8. Linq专题之创建Linq查询表达式

    本节我们主要介绍一下如何创建查询集合类型,关系数据库类型,DataSet对象类型和XML类型的数据源的Linq查询表达式. 下面在实例代码ReadyCollectionData()函数创建了准备的数据 ...

  9. Silverlight项目笔记1:UI控件与布局、MVVM、数据绑定、await/async、Linq查询、WCF RIA Services、序列化、委托与事件

    最近从技术支持转到开发岗,做Silverlight部分的开发,用的Prism+MVVM,框架由同事搭好,目前做的主要是功能实现,用到了一些东西,侧重于如何使用,总结如下 1.UI控件与布局 常用的主要 ...

随机推荐

  1. EntityFramework数据持久化 Linq语法应用

    Linq基础语法 LINQ概述 LINQ(Language Integrated Query,语言集成查询)提供了一种跨数据源和数据格式查询的统一模型. LINQ的组成: LINQ To Object ...

  2. Java实现 LeetCode 641 设计循环双端队列(暴力)

    641. 设计循环双端队列 设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront():将一个元素添加到双端队列头 ...

  3. Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2

    算法提高 陶陶摘苹果2 时间限制:1.0s 内存限制:256.0MB 问题描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出n个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳, ...

  4. Java实现 蓝桥杯VIP 算法提高 促销购物

    算法提高 促销购物 时间限制:1.0s 内存限制:256.0MB 问题描述 张超来到了超市购物. 每个物品都有价格,正好赶上商店推出促销方案.就是把许多东西一起买更便宜(保证优惠方案一定比原价便宜). ...

  5. SQL Server账号密码(sa)登录失败 错误原因:18456

    (其实以前经常用的时候,都很简单,最近一段时间不用了,再一看发现都忘记的差不多了,还是写一篇博客吧,防止下一次再在这种问题上面浪费时间) 使用window登录 打开属性 打开安全性 选择SQL ser ...

  6. Java实现第十届蓝桥杯数列求值

    试题 C: 数列求值 本题总分:10 分 [问题描述] 给定数列 1, 1, 1, 3, 5, 9, 17, -,从第 4 项开始,每项都是前 3 项的和.求 第 20190324 项的最后 4 位数 ...

  7. 一篇文章快速搞懂 Atomic(原子整数/CAS/ABA/原子引用/原子数组/LongAdder)

    前言 相信大部分开发人员,或多或少都看过或写过并发编程的代码.并发关键字除了Synchronized,还有另一大分支Atomic.如果大家没听过没用过先看基础篇,如果听过用过,请滑至底部看进阶篇,深入 ...

  8. gitee+picgo搭建个人博客图床

    gitee+picgo搭建个人博客图床 准备 首先需要去码云注册一个账号,并新建一个仓库.接着下载PicGO并安装好. 过程 点击左下方的插件设置. image 在搜索框中输入gitee搜索插件,安装 ...

  9. Numpy中数据的常用的保存与读取

    保存到文本文件numpy.savetxt()numpy.loadtxt() import numpy as np x= np.arange(0,10,0.1) np.savetxt('save_x', ...

  10. 君荣 TS--8200 消费机显示说明

     Err 001——不在消费时段内Err 002——非本系统卡Err 003——余额不足Err 004——级别未开放Err 005——卡已挂失Err 006——有效期未生效Err 007——已过有效期 ...