- from 子句

- where 子句

- select子句

- group 子句

- into 子句

- orderby 子句

- join 子句

- let 子句

- 复合from子句

- 在某些情况下,源序列中的每个元素本身可能是序列(集合),也可能包含序列

- 用语访问单个数据库中的内部集合

- 使用多个from字句执行连接

- 可以包含多个可从独立数据源生成补充查询的from字句

复合(顾名思义就是有多from的字句)实例:

class Program
{ static void Main(string[] args)
{
List<Student> students = new List<Student> { new Student
{
LastName="xiaogui",Scores=new List<int>{,,,}}, new Student
{
LastName="xiaozhan",Scores=new List<int>{,,,}}, new Student
{
LastName="xiaolan",Scores=new List<int>{,,,}}, new Student
{
LastName="xiaowan",Scores=new List<int>{,,,}},
}; var query = from stuent in students from score in stuent.Scores where score > select new {
Last = stuent.LastName,
score
}; foreach (var student in query)//大于90分的显示出来 {
Console.WriteLine("{0} Score:{1}", student.Last, student.score);
}
Console.ReadLine();
}
}
public class Student
{ public string LastName { get; set; } public List<int> Scores { get; set; }
} public class Employee
{ public string First { get; set; } public string Last { get; set; } public int ID { get; set; }
}

执行结果: xiaogui Score:97

xiaogui Score:91

xiaozhan Score:92

xiaowan Score:92

let 关键字(使用let字句扩展范围变量)

- 创建一个可以查询自身的可枚举类型

- 使查询只能对范围变量word调用一次ToLower。

如果不使用let,则必须在where字句的每个谓词中调用ToLower

例:把每个单词开头包含a或者e的找出来

using System; using System.Linq; public class Test
{ static void Main(string[] args)
{ string[] strings = { "A penny saved is a penny earned.", "The aaxly sdj", "the pa is no" }; var query = from sentence in strings
let words = sentence.Split(' ')//用空格分割成数组 from word in words
let w = word.ToLower()//把每个字母小写 where w[0] == 'a' || w[0] == 'e' select word; foreach (var s in query)
{
Console.WriteLine(s);
}
Console.ReadLine();
}
}

where 关键字 (筛选)

- 一个查询表达式可以包含多个where字句

例:(把包含a的找出来)

using System; using System.Linq; public class Test
{ static void Main(string[] args)
{ string[] str = { "a", "b", "c" }; var query = from s in str where s == "a" select s; foreach (var s in query)
{
Console.WriteLine(s);
}
Console.ReadLine();
}
}

orderby 关键字 (排序)

- 在查询表达式中,orderby字句可以使返回的序列(组)按升序或降序。

- 可以指定多个键,以便执行一个或多个次要排序操作

- 默认排序顺序为升序

- 编译时,orderby字句被转换为对OrderBy方法的调用。orderby字句中的多个键被转换为ThenBy方法调用

descending 降序

ascending 升序

例1:升序

using System; using System.Linq; public class Test
{ static void Main(string[] args)
{ string[] str = { "a", "b", "c" }; var query = from s in str orderby s ascending select s;
}
}

结果为: a b c

例2:降序

using System; using System.Linq; public class Test
{ static void Main(string[] args)
{ string[] str = { "a", "b", "c" }; var query = from s in str orderby s descending select s;
}
}

结果为: c b a

group 关键字 (分组)

- group 字句返回一个IGrouping(TKey,Telement)对象序列

- 编译时,group子句被转换为对GroupBy方法的调用

(LINQ查询表达式可以以select或者Group结束) (如果想要对每个组执行附加查询操作,则可以使用into上下文关键字指定一个临时标识符,使用into时,必须继续编写该查询,并最终用一个select语句或另一 个group子句结束该查询)

例:

using System; using System.Linq; public class Test
{ static void Main(string[] args)
{ string[] str = { "aa", "bb", "cc", "dd" }; var query = from s in str
group s by s[]
into p where p.Key == 'a' || p.Key == 'b' || p.Key == 'c' orderby p.Key descending select p.Key; foreach (var s in query)
{
Console.WriteLine(s);
}
Console.ReadLine();
}
}

结果为: c b a

说明: group s by s[0] into p 意思是针对范围变量s用“s[0]”分组,本例中是用第一个字母分组

join 关键字 (联接)

- 使用join 子句可以将来自不同源序列并且在对象模型中没有直接关系的元素相关联

- 唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值

- join字句使用特殊的equals关键字比较指定的键是否相等

三中常见的连接类型

- 内部联接

- 分组联接

- 左外部联接

1.内部联接

var query = from a in str
join b in str2 on a.id equals b.id select new { Aname = a.name, Bname = b.name };

2.分组联接:(into 可以将join暂存起来)

var query = from a in str
join b in str2 on a.id equals b.id
into c select new {Aname=a.name,Cs=c}

3.左外部联接

- 在左外部联接中,将返回左则源序列中所有元素,即使它们在右则序列中没有匹配的元素也是如此。

- 若要在LINQ中执行左外部联接,请将DefaultifEmpty方法与分组联接结合起来,以指定要在某个左则元素不具有匹配元素时产生的默认右则元素。可以使用null作为任何引

用类型的默认值,也可以指定用户定义的默认类型。

var query = from category in categories
join prod in products on category.id equals prod.CategoryID
into prodGroup from item prodGroup.defaultifEmpty( new Product{Name=string.empty,CategoryID=}) select new {CatName=category.Name,ProdName=item.Name}

equalse 运算符

- join 子句执行同等联接。换句话说,只能基于两个键之间的相等关系进行匹配

- 为了表明所有联接都是相等联接,join子句使用equals关键字而不是==运算符

复合键

- 使用复合键可以测试多个值是否相等

select 关键字 选择

Linq 查询基本操作的更多相关文章

  1. Linq查询基本操作

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

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

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

  3. 【总结】LINQ查询基本操作列表

    每个LINQ查询都以from子句开始,from子句包括以下两个功能. 指定查询将采用数据源. 定义一个本地变量,表示数据源中单个元素. string[] values = { "中国&quo ...

  4. Entity Framework 6 Recipes 2nd Edition(13-6)译 -> 自动编译的LINQ查询

    问题 你想为多次用到的查询提高性能,而且你不想添加额外的编码或配置. 解决方案 假设你有如Figure 13-8 所示的模型 Figure 13-8. A model with an Associat ...

  5. LinqToDB 源码分析——轻谈Linq查询

    LinqToDB框架最大的优势应该是实现了对Linq的支持.如果少了这一个功能相信他在使用上的快感会少了一个层次.本来笔者想要直接讲解LinqToDB框架是如何实现对Linq的支持.写到一半的时候却发 ...

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

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

  7. 《Entity Framework 6 Recipes》中文翻译系列 (26) ------ 第五章 加载实体和导航属性之延缓加载关联实体和在别的LINQ查询操作中使用Include()方法

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-7  在别的LINQ查询操作中使用Include()方法 问题 你有一个LINQ ...

  8. Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)

    为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...

  9. c# Linq查询

    c#提供的ling查询极大的遍历了集合的查询过程,且使用简单方便,非常的有用. 下面将分别用简单的例子说明:ling基本查询.延迟查询属性.类型筛选.复合from字句.多级排序.分组查询.联合查询.合 ...

随机推荐

  1. 创建对象时引用的关键字,assign,copy,retain

    创建对象时引用的关键字:assign: 简单赋值,不更改索引计数(强引用)copy: 建立一个索引计数为1的对象,然后释放旧对象retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索 ...

  2. 1.想写一些关于c++的东西了,就作为个开篇吧

    又再一次重拾c++,想写一些东西,给自己看看,不想再看一些隐晦翻译的外国书籍了,就从一本好读的书开始写一写. 就这本吧, <我的第一本C++书>> 来写一写自己的东西.

  3. jdk配置环境变量

    介绍在linux下配置jdk环境变量的几种常用方法. 首先在linux下安装jdk,如果出现提示权限不够(且root下也提示权限不够),可用#ls -l filename命令查看一下,如果显示类似如: ...

  4. javascript写的新闻滚动代码

    在企业站中,我们会看到很多新闻列表很平滑的滚动,但是这种功能自己写太浪费时间,下面是我整理好的一组很常用的新闻列表滚动,有上下分页哦! 1.body里面 <div class="tz_ ...

  5. 容器的深入研究(二)—Set与Map

    一.Set类的作用 二.Set类延生的四种形式 三.非基础类型如何使用Set的四种形式 四.Queue的使用 五.PriorityQueue的使用 六.Map的六种形式 七.HashMap散列码的实现 ...

  6. 做一个正气的杭电人--hdu2500

    做一个正气的杭电人 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  7. Hopscotch(POJ 3050 DFS)

    Hopscotch Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2845   Accepted: 1995 Descrip ...

  8. jsp执行数据库查询并分页

    需求: 有一批企业的基本信息需要展示出来,要求一级页以列表形式展示企业清单,点击公司名称后进入二级页面,二级页面展示企业简介和几张图片. 实现效果: 开发环境: Win7,Eclipse,Mysql ...

  9. BZOJ 2535 Plane 航空管制2

    http://www.lydsy.com/JudgeOnline/problem.php?id=2535 思路:对于1,我们只需要每个点比前驱大就可以了,然后满足尽量优. 对于第二问,我们先求出这个点 ...

  10. 新发现一个函数:GradientFill

    位于Msimg32.dll之中 https://msdn.microsoft.com/en-us/library/windows/desktop/dd144957(v=vs.85).aspx