1.LINQ的两种语法

LINQ查询时有两种语法可供选择:查询表达式(Query Expression)和方法语法(Fluent Syntax)。
.NET公共语言运行库(CLR)并不具有查询表达式的概念。所以编译器会在程序编译时把查询表达式转为方法语法,即对扩展方法的调用。所以使用方法语法会让我们更加接近和了解LINQ的实现和本质,并且一些查询只能表示为方法调用。但另一方面,查询表达式通常会比较简单易读。不管怎样,这两种语法是互相补充和兼容的,我们可以在一个查询中混合使用查询表达式和方法语法。

2.一些有用的LINQ扩展方法

扩展方法 描述 延期
All 如果源数据中的所有条目都与谓词匹配,则返回true
Any 如果源数据中至少有一个条目与谓词匹配,则返回true
Contains 如果数据源含有指定的条目或值,则返回true
Count 返回数据源的条目数
First 返回数据源的第一个条目
FirstOrDefault 返回数据源的第一个条目或无条目时,返回默认值
Last 返回数据源的最后一个条目
LastOrDefault 返回数据源的最后条目或无条目时,返回默认值
Max
Min
返回由lambda表达式表示的最大值或最小值
OrderBy
OrderByDescending
基于lambda表达式返回的值对源数据进行排序
Reverse 反转数据源中数据项的顺序
Select 设计一个查询结果
SelectMany 把每个数据项投射到一个条目序列中,然后把所有这些结果序列连接成一个序列
Single 返回数据源的第一个条目或有多个匹配时,抛出一个异常
SingleOrDefault 返回数据源的第一个条目或无条目时,返回默认值;或者有多个匹配条目时,抛出一个异常
Skip
SkipWhile
跳过指定数目的元素或当谓词匹配时,跳过
Sum 对谓词选定的值求和
Take
TakeWhile
从数据源的开始处选择指定数目的元素或当谓词匹配时,选择条目
ToArray
ToDictionary
ToList
把数据源转换成数组或其他集合类型
Where 过滤掉源数据中与谓词不匹配的条目

3.LINQ查询表达式

约束

LINQ查询表达式必须以from子句开头,以select或group子句结束。

关键字

功能

from…in…

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

注意:c#编译器会把“复合from子句”的查询表达式转换为SelectMany()扩展方法。

join…in…on…equals…

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

let

引入用于存储查询表达式中子表达式结果的范围变量。通常能达到层次感会更好,使代码更易于阅读。

orderby、descending

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

where

指定元素的筛选条件。多个where子句则表示了并列条件,必须全部都满足才能入选。每个where子句可以使用谓词&&、||连接多个条件表达式。

group

指定元素的分组字段。

select

指定查询要返回的目标数据,可以指定任何类型,甚至是匿名类型。(目前通常被指定为匿名类型)

into

提供一个临时的标识符。该标识可以引用join、group和select子句的结果。

1)        直接出现在join子句之后的into关键字会被翻译为GroupJoin。(into之前的查询变量可以继续使用)

2)        select或group子句之后的into它会重新开始一个查询,让我们可以继续引入where, orderby和select子句,它是对分步构建查询表达式的一种简写方式。(into之前的查询变量都不可再使用)

4.复写linq语法详细中的11个例子

1)简单的LINQ语法

1
2
3
4
5
6
7
//1
var ss=from r in db.testTable
                select r;
//2
var ss1=db.testTable;
//3
string sssql="selec * from testTable";

2)带Where的查询

1
2
3
4
5
6
7
8
//1
var ss=from r in db.testTable
            where r.rpId>10
            select r;
//2
var ss1=db.testTable.Where(p=>p.rpId>10);
//3
string sssql="select * from testTable where rpId>10";

3)简单函数计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//1
//获取最大的rpId
var ss=(from r in db.testTable select r).Max(p=>p.rpId);
//获取最小的rpId
var ss=(from r in db.testTable select r).Min(p=>p.rpId);
//获取结果集的总数
var ss=(from r in db.testTable select r).Count();
//获取rpId的和
var ss=(from r in db.testTable select r).Sum(p=>p.rpId);
 
 //2
//var ss1 = db.testTable.Max(p=>p.rpId);
//var ss1 = db.testTable.Min(p => p.rpId);
//var ss1 = db.testTable.Count() ;
var ss1 = db.testTable.Sum(p => p.rpId);
Response.Write(ss);
 
//3
string sssql = "select max(rpId) from testTable";
           sssql = "select min(rpId) from testTable";
           sssql = "select count(1) from testTable";
           sssql = "select sum(rpId) from testTable";

4)排序

1
2
3
4
5
6
7
8
9
10
11
var ss=from r in db.testTable
            where r.rpId>10
            orderby r.rpId descending //倒序
            //orderby r.rpId ascending  //正序
            select r;
//正序
var ss1=db.testTable.OrderBy(p=>p.rpId).Where(p=>p.rpId>10).ToList();
//倒序
var ss2=db.testTable.OrderByDescending(p=>p.rpId).Where(p=>p.rpId>10).ToList();
 
string sssql="select * from testTable where rpId>10 order by rpId [decs|asc]";

5)top(1)

1
2
3
4
5
6
7
8
//如果取最后一个可以按倒序排列再取值
var ss=(from r in db.testTable select r).FirstOrDefault();
 
//
var ss1=db.testTable.FirstOrDefault();
var ss1=db.testTable.First();
 
string sssql="select top(1) * from testTable";

6)跳过前面多少条数据取余下的数据

1
2
3
4
5
6
7
8
//1
var ss=(from r in db.testTable
                orderby r.rpId descending
                select r).Skip(10); //跳过前10条数据,取10条之后的所有数据
//2
var ss1=db.testTable.OrderByDescending(p=>p.rpId).Skip(10).ToList();
//3
string sssql="select * from (select ROW_NUMBER() over(order by rpId desc) as rowNum,* from testTable) as t where rowNum>10";

7)分页数据查询

1
2
3
4
5
6
7
8
9
10
11
//1
var ss=(from r in db.testTable
                where r.rpId>10
                orderby r.rpId descending
                select r).Skip(10).Take(10); //取第11条到第20条的数据
//2.Take(10):数据从开始获取,获取指定数量的连续数据
var ss1=db.testTable.OrderByDescending(p=>p.rpId).Where(p=>p.rpId>10).Skip(10).Take(10).ToList();
 
//3
string sssql="select * from (select ROW_NUMBER() over(order by rpId desc) as rowNum,* from testTable) as c where rowNum>10
and rowNum<=20";

8)包含,类似like ‘%%’

1
2
3
4
5
6
7
8
//1
var ss = from r in db.testTable
         where r.SortsText.Contains("张")
         select r;
//2
var ss1 = db.testTable.Where(p => p.SortsText.Contains("张")).ToList();
//3
string sssql = "select * from testTable where SortsText like '%张%'";

参考资料

linq语法详细

Linq之旅:Linq入门详解(Linq to Objects)

C#Linq的10个练习的更多相关文章

  1. C# LINQ(10)

    LINQ 查询 var query = from r in Formula1.GetChampions() where r.Country == "Brazil" orderby ...

  2. Linq 学习笔记

    简介: LINQ 提供一种统一的方式,让我们能在C#语言中直接查询和操作各种数据.​​ LINQ是用来描述数据访问总体方式的术语.LINQ to Object是针对实现了IEnumerable< ...

  3. Linq/List/Array/IEnumerable等集合操作

    来源:http://www.cnblogs.com/liushanshan/archive/2011/01/05/1926263.html 目录 1    LINQ查询结果集    1 2    Sy ...

  4. TinyFrame升级之九:实现复杂的查询

    本章我们主要讲解如何实现一个复杂的查询.由于目前TinyFrame框架已经投入到了实际的项目生产中,所以我很乐意将项目中遇到的任何问题做以记录并备忘. 这章中,我们提到的查询界面如下所示: 其中,涉及 ...

  5. Demo+在Linux下运行(CentOS7+dotnetcore sdk)

    来份ASP.NET Core尝尝 0x01.前言 学习ASP.NET Core也有一段时间了,虽说很多内容知识点还是处于一知半解的状态,但是基本的,还是 略懂一二.如果有错误,还望见谅. 本文还是和之 ...

  6. 8天玩转并行开发——第三天 plinq的使用

    原文 8天玩转并行开发——第三天 plinq的使用 相信在.net平台下,我们都玩过linq,是的,linq让我们的程序简洁优美,简直玩的是爱不释手,但是传统的linq只是串行代码,在并行的 年代如果 ...

  7. 用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署

    用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署 这是微软官方SignalR 2.0教程Getting Started with En ...

  8. 机器Coding For WPF

    declare @modelcode varchar(90)='AutoProjectType'declare @ns varchar(90)='WpfApplication'declare @dat ...

  9. Core3.1WebApi使用MongoDB

    好久没有使用MongoDB了,重新测试使用,版本不一样之前很多方法都使用不了了,下面为部分测试,下次再来更新测试 测试中使用的命令 // 新增读写的用户 db.createUser({ user:'f ...

随机推荐

  1. POJ_2185_二维KMP

    http://poj.org/problem?id=2185 求最小覆盖矩阵,把KMP扩展到二维,行一次,列一次,取最小覆盖线段相乘即可. #include<iostream> #incl ...

  2. avtivity与view

    view和activity的区别 activity相当于控制部分,view相当于显示部分.两者之间是多对多的关系,所有东西必须用view来显示.  viewGroup继承自view,实现了ViewMa ...

  3. (二)MyBatis延迟加载,一级缓存,二级缓存

    延迟加载配置: 什么时候用延迟加载?比如现在有班级和学生表,一对多关系,你可能只需要班级的信息,而不需要该班级学生的信息,这时候可以进行配置,让查询时先查询到班级的信息,在之后需要学生信息时候,再进行 ...

  4. Virus:病毒查杀

    简介 小伙伴们,大家好,今天分享一次Linux系统杀毒的经历,还有个人的一些总结,希望对大家有用. 这次遇到的是一个挖矿的病毒,在挖一种叫门罗币(XMR)的数字货币,行情走势请看 https://ww ...

  5. meta 的作用 搜集

    Meta标签中的format-detection属性及含义   format-detection翻译成中文的意思是“格式检测”,顾名思义,它是用来检测html里的一些格式的,那关于meta的forma ...

  6. 我的一个配置redux(实现一次存储与调用方法)之旅

    前言 : 今天呢,就配置一下redux,redux的重要性呢,就叭叭叭一大堆,什么也没有带着配置一次来的重要,因为许多涉及到的属性和方法,用法是活的,但格式是需要记忆的. 过程中不要嫌我唠叨,有的地方 ...

  7. 题解P1104生日

    \(\color{blue}{P1104 生日(题目传送门)}\) 这道题的大意是:给出n个人的出生日期,让我们按年龄(就是先比年份,再比月份和日期,这是常识好吧)大小来排序,如果相同则按输入顺序排序 ...

  8. Spring源码阅读笔记01:源码阅读环境准备

    1. 写在前面 对于做Java开发的同学来说,Spring就像是一条绕不过去的路,但是大多数也只是停留在对Spring的简单使用层面上,对于其背后的原理所知不多也不愿深究,关于这个问题,我在平时的生活 ...

  9. expect知识梳理

    1 expect expect软件用于实现非交互式操作,实际应用中常用于批量部署,可以帮助运维人员管理成千上万台服务器. expect实现非交互式操作主要是在程序发出交互式询问时,按条件传递程序所需的 ...

  10. [Redis-CentOS7]Redis发布订阅操作(七)

    发布订阅 发布:打电话 订阅:接电话 订阅频道 127.0.0.1:6379> SUBSCRIBE msg Reading messages... (press Ctrl-C to quit) ...