从LinqPad入门Linq
为什么要学习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语句进行扩展
- 所有的linq查询都是以from开始,select或group结束。
- p是范围变量,Persons是数据集合。
- 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的更多相关文章
- 使用 LINQPad 助力 LINQ 学习
简介一图示意 简介 LINQPad 是一款学习 LINQ,优化 SQL 的好助手. 它的一大特点是内置了新版<C# in a Nutshell>的全部 LINQ 示例,不管是配合原书进行练 ...
- Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解
返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...
- 8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解
本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LI ...
- linq 动态组合条件
http://www.albahari.com/nutshell/predicatebuilder.aspx Dynamically Composing Expression Predicates S ...
- [Json.net]Linq to Json
引言 上篇学习了json.net的基本知识,这篇学习linq to json. 上篇文章:[Json.net]快速入门 Linq to Json Linq to Json是用来快速操作json对象的, ...
- 构造复杂Lambda困惑之学会用LinqPad和Linqer实现Sql 和 Lambda之间的互转
一:linq的话我们可能会遇到两个问题: 1. 我们的linq出现性能低下的时候,如果优化???? 我们写的linq所生成的sql是无法控制的... (要做性能优化,必须预先知道sql会生成啥样的?? ...
- LINQPad 应用
https://www.linqpad.net/ 使用 LINQPad 调试linq以及lambda表达式 http://www.studyofnet.com/news/1168.html linq ...
- EntityFramework优缺点(转)
Entity Framework 是微软推荐出.NET平台ORM开发组件, 现在已放源代码. 以下我们来讨论一下优缺点和一些问题, 以下简称EF. 有兴趣可查询官网的Entity Framewo ...
- 推荐几个对Asp.Net开发者比较实用的工具 2
推荐几个对Asp.Net开发者比较实用的工具.大家有相关工具也可以在评论区留言,一起努力学习. 作为程序员要有挑战精神,大家可以尝试一下这些工具. 已经有篇文章写到了vs的扩展工具,这里不再累赘,请查 ...
随机推荐
- 208. Implement Trie (Prefix Tree) -- 键树
Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...
- IOS-网络(AFNetworking)
一.AFNetWorking基本使用 // // ViewController.m // IOS_0112_AFNetWorking // // Created by ma c on 16/2/11. ...
- Memcached工作原理及常见问题
memcached是怎么工作的? Memcached的神奇来自两阶段哈希(two-stage hash).Memcached就像一个巨大的.存储了很多<key,value>对的哈希表.通过 ...
- python实践报错:SyntaxError: Non-ASCII character
报错: File "C:\001myWorkspace\001myWork\workspace2\MyFirstPython\src\demo4\demo4-2.py", line ...
- RF/GBDT/XGBoost/LightGBM简单总结(完结)
这四种都是非常流行的集成学习(Ensemble Learning)方式,在本文简单总结一下它们的原理和使用方法. Random Forest(随机森林): 随机森林属于Bagging,也就是有放回抽样 ...
- CentOS6下yum升级安装mysql
CentOS6默认版本的mysql是5.1.73,当前主流版本一般为mysql-5.6,需要安装该版本的话可以执行以下操作 1.1.卸载旧版mysql 1)备份数据 # 直接删除老版本的相关文件可能会 ...
- Android filesystem system rw(read/write) permission
/********************************************************************************* * Android filesys ...
- Javascript 中 switch case 等于 (== )还是 恒等于(===)?
Javascript 中 switch case 等于 (== )还是 恒等于(===)? 可以测试一下以下代码,这个 case 中是 等于(==)还是恒等于(===) <script> ...
- 关于AOP无法切入同类调用方法的问题
一.前言 Spring AOP在使用过程中需要注意一些问题,也就是平时我们说的陷阱,这些陷阱的出现是由于Spring AOP的实现方式造成的.每一样技术都或多或少有它的局限性,很难称得上完美,只要掌握 ...
- ASP.NET Web Pages
ylbtech-.Net-ASP.NET Web Pages: 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返 ...