为什么要学习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. Presto改造

    最近在打造一款可视化分析产品, 需要用到组合多数据源, 进行查询, 看了挺多开源的插件, 发现目前只有Presto比较符合, 但是由于Presto没有多用户机制和资源管理, 所以需要在这基本上构建多用 ...

  2. 阿里云服务器购买 发布web项目全过程

    http://blog.csdn.net/liona_koukou/article/details/50496946

  3. oracle用户 密码永不过期

    ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

  4. vue.js利用vue.router创建前端路由

    node.js方式: 利用node.js安装vue-router模块 cnpm install vue-router 安装完成后我们引入这个模板! 下载vue-router利用script引入方式: ...

  5. 99%的人都理解错了HTTP中GET与POST的区别(转自知乎)

    作者:Larry链接:https://zhuanlan.zhihu.com/p/22536382来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. GET和POST是HTT ...

  6. 【转】MongoDB 3.0 正式版本即将发布,强力推荐

    MongoDB 今天宣布3.0 正式版本即将发布.这标志着 MongoDB 数据库进入了一个全新的发展阶段,提供强大.灵活而且易于管理的数据库管理系统. MongoDB 3.0 在性能和伸缩性方面都有 ...

  7. Linux上jdk安装及环境变量设置

    1.jdk下载和安装 (1)http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载需 ...

  8. [UOJ46][清华集训2014]玄学

    uoj description 给出\(n\)个变换,第\(i\)个变换是将区间中\(l_i,r_i\)的数\(x\)变成\((a_ix+b_i)\mod m\). 每次会新增一个变换,或者查询询问如 ...

  9. 浅谈 Gevent 与 Tornado(转)

    原文:http://www.pywave.com/2012/08/17/about-gevent-and-tornado/ 还是前几月的时候,几乎在同一时间,自己接触到了 Gevent 和 Torna ...

  10. 记录一次MyEclipse工程搭建的辛酸

    一个历史项目,使用的是Myeclipse6.5版本:这一天就砸在这个项目了. 调通web项目:内置的是tomcat插件,貌似和eclipse的server版的还不太一样. 长这个样子: