从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的扩展工具,这里不再累赘,请查 ...
随机推荐
- localStorage(本地存储)使用总结
1.https://www.cnblogs.com/st-leslie/p/5617130.html (localStorage使用总结)
- mac下安装apache tomcat
目录 一. 默认版: 二. 自定义下载配置版: ———————————————————————正文—————————————————————————— 一. 默认版: ##一.mac 自带了apach ...
- Entity Framework 数据并发访问错误原因分析与系统架构优化
博客地址 http://blog.csdn.net/foxdave 本文主要记录近两天针对项目发生的数据访问问题的分析研究过程与系统架构优化,我喜欢说通俗的白话,高手轻拍 1. 发现问题 系统新模块上 ...
- Spinner的用法
1.先自定义一个数组 2.在new一个ArrayAdapter方法: ArrayAdapter<String> adapter = new ArrayAdapter<String&g ...
- vue+webpack多个项目共用组件动态打包单个项目
原文复制:https://www.jianshu.com/p/fa19a07b1496 修改了一些东西,因为sh脚本不能再window电脑执行,所以改成了node脚本.这是基于vue-cli2.0配置 ...
- celery docker 基本使用
项目参考官网资料,比较简单的add task 具体代码参考https://github.com/rongfengliang/celery-docker-demo 项目结构 ├── README.md ...
- [您有新的未分配科技点]可,可,可持久化!?------0-1Trie和可持久化Trie普及版讲解
这一次,我们来了解普通Trie树的变种:0-1Trie以及在其基础上产生的可持久化Trie(其实,普通的Trie也可以可持久化,只是不太常见) 先简单介绍一下0-1Trie:一个0-1Trie节点只有 ...
- 基数排序算法-python实现
#-*- coding: UTF-8 -*- import numpy as np def RadixSort(a): i = 0 #初始为个位排序 n = 1 #最小的位数置为1(包含0) max ...
- 02 - Unit02:登录功能
需求实现步骤 发送Ajax请求 服务器处理 Ajax回调处理 登录功能 发送Ajax请求 绑定事件:"登录"按钮的单击事件 获取参数:用户名userName和密码password ...
- 2018-2019-1 20165226《信息安全系统设计基础》 pwd命令的实现
2018-2019-1 20165226<信息安全系统设计基础> pwd命令的实现 一.学习pwd 查看pwd 得知一个嫩过去文件路径的函数--getcwd i节点值 通过ls -i -a ...