为什么要学习Linq?

在我们日常开发中,经常需要从数据库中执行各式各样的查询来获取需要的数据。但是如果需要对查询获得的数据进行二次筛选呢?linq就提供了对于可枚举类型(实现IEnumerable接口)的一种便捷查询方式。正如其名Language Integrated Query语言集成查询。

下载LinqPad

LinqPad官方网站http://www.linqpad.net/,此篇示例使用的是LinqPad4。

安装完成后界面如下:

点击左侧Add connection,添加数据库连接,本机是sqlserver 2008 R2,选择默认的LINQ to SQL,NEXT,选择你想要添加的数据库,点击OK即可添加成功。

展开你连接的库树,表,存储过程,方法等都能够在视图中展示(如果数据库存在架构,表存放在其所属架构下)。

所有的表展开后都成为了”表名s”的格式,体现了Linq查询将表当做数据的集合的思想。

Linq的语法

右键选中其中一个集合弹出菜单。

分割线上:Take/Count/Where均是Qureyable方法(查询方法),以及两个查询模板。

分割线下:查询或编辑数据。

这里我们选择第一个模板

代码编辑窗口出现如下代码,这是一个比较直观的Linq语句模板

from p in Persons
where p.
select p

Language→C# Program 并将其补充完整为我们在.Net开发中经常用到的C#代码块格式。

void Main()
{
var result = from p in Persons
where p.MiddleName == "A"
select p;
result.Count().Dump();//输出结果个数
}

以此为基础,可以对Linq语句进行扩展

  1. 所有的linq查询都是以from开始,select或group结束。

  2. p是范围变量,Persons是数据集合。
  3. where关键字后是查询条件,可以同时存在多个where

补充:有时编译器不能够识别自定义类型,可以显式指定范围变量的类型。如:from Person p in Persons。

where p.MiddleName=="A"
where p.Title=="Mr."
//等同于
where p.MiddleName=="A"&&where p.Title=="Mr."

指得注意的是,var是推断类型,C#3.0新出的特性。编译器编译的过程中推断变量是什么类型,和所谓的强弱类型无关。(很多人说var是弱类型,这个是错误的)。

比如,下图编译器推断dr为Object类型,无法通过索引器去访问,编译时报错。

更改为DataRow后编译通过

PS: 既然是在编译过程中推断而不是运行时,所以就没有效率高低之分。但是为了代码的易读性和巩固基础,少用为好。

排序orderby:

var result=from p in Persons
where p.MiddleName=="A"
orderby p.EmailPromotion //默认升序,降序descending
select p;

分组group by:

var result=from p in Persons
where p.MiddleName=="A"
group p by p.Title;

let关键字:在查询中定义变量。

into关键字:将查询结果放入一个变量,再次使用。

var result=from p in Persons
let midname=p.MiddleName
where midname=="A"|| midname=="J"
group p by p.Title
into temp
where temp.Count()>1
select temp;

join关键字:内连接,左连接,右连接。此处用到了linq to sql

void KeyWordJoin()
{ DataContext ctx = new DataContext(); //内连接
var innerJoin = from p in ctx.Person
where p.BusinessEntityID == 9
join c in ctx.Customer on p.BusinessEntityID equals c.CustomerID
select p; //左连接
var leftJoin = from p in ctx.Person
join c in ctx.Customer on p.BusinessEntityID equals c.CustomerID
into joined
from j in joined.DefaultIfEmpty() //join操作后,返回的集合为在后方的类型此处为Customer
select new { ID = p.BusinessEntityID, Number = j == null ? null : j.AccountNumber };
//右连接同理
var rightJoin = from c in ctx.Customer
join p in ctx.Person on c.CustomerID equals p.BusinessEntityID
into joined
from j in joined.DefaultIfEmpty()
select new { ID = c.CustomerID, Last = j == null ? null : j.LastName}; }

从LinqPad入门Linq的更多相关文章

  1. 使用 LINQPad 助力 LINQ 学习

    简介一图示意 简介 LINQPad 是一款学习 LINQ,优化 SQL 的好助手. 它的一大特点是内置了新版<C# in a Nutshell>的全部 LINQ 示例,不管是配合原书进行练 ...

  2. Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解

    返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...

  3. 8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解

    本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LI ...

  4. linq 动态组合条件

    http://www.albahari.com/nutshell/predicatebuilder.aspx Dynamically Composing Expression Predicates S ...

  5. [Json.net]Linq to Json

    引言 上篇学习了json.net的基本知识,这篇学习linq to json. 上篇文章:[Json.net]快速入门 Linq to Json Linq to Json是用来快速操作json对象的, ...

  6. 构造复杂Lambda困惑之学会用LinqPad和Linqer实现Sql 和 Lambda之间的互转

    一:linq的话我们可能会遇到两个问题: 1. 我们的linq出现性能低下的时候,如果优化???? 我们写的linq所生成的sql是无法控制的... (要做性能优化,必须预先知道sql会生成啥样的?? ...

  7. LINQPad 应用

    https://www.linqpad.net/ 使用 LINQPad 调试linq以及lambda表达式 http://www.studyofnet.com/news/1168.html linq ...

  8. EntityFramework优缺点(转)

    Entity Framework  是微软推荐出.NET平台ORM开发组件, 现在已放源代码.  以下我们来讨论一下优缺点和一些问题, 以下简称EF.  有兴趣可查询官网的Entity Framewo ...

  9. 推荐几个对Asp.Net开发者比较实用的工具 2

    推荐几个对Asp.Net开发者比较实用的工具.大家有相关工具也可以在评论区留言,一起努力学习. 作为程序员要有挑战精神,大家可以尝试一下这些工具. 已经有篇文章写到了vs的扩展工具,这里不再累赘,请查 ...

随机推荐

  1. LeetCode 48

    这种方法首先对原数组取其转置矩阵,然后把每行的数字翻转可得到结果,如下所示(其中蓝色数字表示翻转轴): 1  2  3  1  4  7  7  4  1 4  5  6 -->  2  5   ...

  2. 本人遇到的spring事务之UnexpectedRollbackException异常解决笔记

    本人最近在使用spring事务管理的过程中遇到如下异常,导致服务端抛出500给前端,让搞前端的哥们抱怨我心里着实不爽,前前后后折腾了近半个小时才得于解决,今天就做个笔记,以免日后又犯这个错误.好了,错 ...

  3. jspf、jsp小记

    jsp页面:

  4. Tomcat : Invalid character found in the request target

    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC ...

  5. SSH使用主机名访问

    比如说A电脑已经和B电脑实现了ssh免密码登陆!但是A电脑通过 ssh B电脑的主机名称 不行! 解决办法: 01.修改A电脑中的hosts文件    vim /etc/hosts 02.进入编辑界面 ...

  6. centos7.3安装配置vsftp

    首先使用命令查看,系统内是否安装了vsftp [root@instance_290388 down]# rpm -qa |grep vsftp 如果没有安装,使用命令,进行安装 [root@insta ...

  7. 流程设计器jQuery + svg/vml(Demo6 - 增加结点属性及切换)

    到目前流程设计器流程结点的拖拽操作已基本完成,接下来就到结点的属性开发了.前面已经开发过流程模板的属性了,结点属性跟模板属性类似,从属性模板定义copy一份,然后按各结点类型进行调整就ok. 1.先来 ...

  8. PHP ksort() 函数

    PHP ksort() 函数 PHP Array 函数 实例 按照键名对关联数组进行升序排序: <?php $age=array("Bill"=>"60&qu ...

  9. Centos 7 系统详解

      安装CentOS 7系统后,变化竟然这么大? 一.Runlevel首先一条,原来一直用的CentOS-6.5-x86_64-minimal.iso光盘镜像(400M左右无图形系统小巧便捷),而7目 ...

  10. ubuntu16.04安装Nvidia显卡驱动、CUDA8.0和cudNN V6

    Nvidia显卡驱动安装 在ubuntu搜索框输入 软件更新,打开 "软件和更新" 对话框,在 附加驱动里选择系统检测到的Nvidia驱动,应用更改,重启系统: 安装完成之后查看G ...