Entity Framework 学习系列(5) - EF 相关查询
写在前面
IEnumberable与IQueryable的区别?
IEnumberable类在调用Skip和Take等拓展方法前数据已经加载再本地内存中。
IQueryable是将Skip和Take这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令的,也就是延迟加载在要真正显示数据的时候才执行。
那什么时候使用IQueryable和IEnumberable?
在数据访问层中使用IQueryable,因为可以把对数据加载延迟到业务逻辑层中处理。
很多时候,业务层调用数据访问层的方法并不要求马上从数据库中加载数据再到内存中。
如果在业务层需要使用延迟加载时,我们可以在业务层把IQueryable转换成IEnumberable把数据加载出来。
注意:其中 ToList()、FirstOrDefault()、InClude()方法可以禁止延迟加载。
一、使用Stopwatch 查询执行效率
在声明Stopwatch() 对象需要引用using System.Diagnostics;
//1.声明对象
Stopwatch st=new Stopwatch();
//2.开始
st.Start();
//
//3.执行代码
//
//4.结束
st.Stop();
//5.输出
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
二、简单查询
1.Linq写法:
static void SipleQuery_Linq()
{
//依赖上下文对象
using(DatabaseContext _db=new DatabaseContext())
{
//声明Stopwatch对象
Stopwatch st=new Stopwatch();
//执行开始
st.Start();
//Linq 简单查询
//语法格式:from 变量 in 实体 select 变量;
var result=from q in _db.shippers
select q;
//输出结果
foreach(var item in result)
{
Console.WriteLine("供应商编号:" + item.ShipperId);
Console.WriteLine("供应商名称:" + item.CompanyName);
Console.WriteLine("联系电话:" + item.Phone);
Console.WriteLine("---------------------------------");
}
//执行结束
st.Stop();
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
Console.ReadKey();
}
}
2.Lambda表达式写法:
static void SipleQuery_lambda()
{
//上下文依赖
using(DatabaseContext _db=new DatabaseContext())
{
//声明Stopwatch
Stopwacth st=new Stopwatch();
//执行开始
st.Start();
//Lambda 写法
var result =_db.shippers.ToList();
//输出结果
foreach(var item in result)
{
Console.WriteLine("供应商编号:" + item.ShipperId);
Console.WriteLine("供应商名称:" + item.CompanyName);
Console.WriteLine("联系电话:" + item.Phone);
Console.WriteLine("---------------------------------");
}
//执行结束
st.Stop();
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
Console.ReadKey();
}
}
三、条件查询
1.Linq 写法
static void WhereQuery_Linq()
{
//声明上下文依赖
using(DatabaseContext _db=new DatabaseContext())
{
//声明对象 需要引用 using System.Diagnostics;
Stopwatch st=new Stopwatch();
//执行开始
st.Start();
//linq 写法
var result=from q in _db.shippers
where q.ShipperId==1
select q;
//输出
foreach (var item in result)
{
Console.WriteLine("供应商编号:" + item.ShipperId);
Console.WriteLine("供应商名称:" + item.CompanyName);
Console.WriteLine("联系电话:" + item.Phone);
Console.WriteLine("---------------------------------");
}
//执行结束
st.Stop();
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
Console.ReadKey();
}
}
2.lambda 写法
static void WhereQuery_lambda()
{
//上下文依赖对象
using(DatabaseContext _db=new DatabaseContext())
{
//声明Stopwatch
Stopwatch st=new Stopwatch();
//执行开始
st.Start();
//lambda表达式
var result=_db.shippers.Where<Shippers>(q=>q.ShipperId==1);
//输出结果
foreach (var item in result)
{
Console.WriteLine("供应商编号:" + item.ShipperId);
Console.WriteLine("供应商名称:" + item.CompanyName);
Console.WriteLine("联系电话:" + item.Phone);
Console.WriteLine("---------------------------------");
}
//执行结束
st.Stop();
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
Console.ReadKey();
}
}
四、聚合函数
1.Linq 写法
static void Query_Linq()
{
//上下文依赖
using(DatabaseContext _db = new DatabaseContext())
{
//声明Stopwatch对象
Stopwatch st = new Stopwatch();
//执行开始
st.Start();
var linq_result_count = (from c in _db.shippers select c).Count();
var linq_result_max = (from x in _db.shippers select x).Max(x => x.ShipperId);
var linq_result_min = (from x in _db.shippers select x).Min(c => c.ShipperId);
//执行结束
st.Stop();
//输出
Console.WriteLine("总记录条数:", linq_result_count);
Console.WriteLine("主键最大值:", linq_result_max);
Console.WriteLine("主键最小值:", linq_result_min);
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
Console.ReadKey();
}
}
2.Lambda 写法
static void Query_Lambda()
{
//声明上下文
using(DatabaseContext _db = new DatabaseContext())
{
//声明Stopwatch
Stopwatch st = new Stopwatch();
//执行开始
st.Start();
var result_count = _db.shippers.Count();
var result_max = _db.shippers.Max(c => c.ShipperId);
var result_min = _db.shippers.Min(c => c.ShipperId);
//执行结束
st.Stop();
//输出
Console.WriteLine("总记录条数:", linq_result_count);
Console.WriteLine("主键最大值:", linq_result_max);
Console.WriteLine("主键最小值:", linq_result_min);
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
Console.ReadKey();
}
}
五、内连接
1.Linq 写法
- 语法格式:(自己总结,不喜勿喷)
from 变量1 in 实体对象1
Join 变量2 in 实体对象2
on 变量1.字段 equals on 变量2.字段
select new{ 重新查询的字段 };
- 具体实例
static void JoinQuery_Linq()
{
//上下文依赖
using(DatabaseContext _db=new DatabaseContext())
{
//声明Stopwatch
Stopwatch st=new Stopwatch();
//执行开始
st.Start();
var result=from a in _db.productus
join b in _db.shippers
on a.SupplierId equals b.ShipperId
select new {
a.ProductId,
a.ProductName,
b.CompanyName
};
foreach (var item in result)
{
Console.WriteLine("产品编号:" + item.ProductId);
Console.WriteLine("产品名称:" + item.ProductName);
Console.WriteLine("供应商名称:" + item.CompanyName);
Console.WriteLine("---------------------------------");
}
//执行结束
st.Stop();
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
Console.ReadKey();
}
}
2.Lambda Join写法
- 语法格式:(自己总结,不喜勿喷)
上下文对象.实体对象1.Join(实体对象2,
实体对象1 lambda 表达式,
实体对象2 lambda 表达式,
(实体1变量,实体2变量)=>new {需要查询的字段});
- 具体实例
static void JoinQuery_Lambda()
{
//上下文依赖
using(DatabaseContext _db=new DatabaseContext())
{
//声明Stopwatch
Stopwatch st=new Stopwatch();
//执行开始
st.Start();
var result=_db.productus.Join(_db.shippers, p => p.SupplierId, s => s.ShipperId, (p, s) => new {
p.ProductId,
p.ProductName,
s.CompanyName
});
foreach (var item in result)
{
Console.WriteLine("产品编号:" + item.ProductId);
Console.WriteLine("产品名称:" + item.ProductName);
Console.WriteLine("供应商名称:" + item.CompanyName);
Console.WriteLine("---------------------------------");
}
//执行结束
st.Stop();
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
Console.ReadKey();
}
}
六、左外部连接
1.Linq 写法
左外部联接,它返回第一个集合中的所有元素,无论它是否在第二个集合中有相关元素。
在 LINQ 中,通过对分组联接的结果调用 DefaultIfEmpty()方法来执行左外部联接。
DefaultIfEmpty()方法从列表中获取指定元素。如果列表为空,则返回默认值。
static void LeftJoinQuery()
{
//依赖上下文对象
using(DatabaseContext _db=new DatabaseContext())
{
//声明Stopwatch
Stopwatch st=new Stopwatch();
//执行开始
st.Start();
var result=from a in _db.productus
join b in _db.shippers
on a.SupplierId equals b.ShipperId into GRP
from GRP2 in GRP.DefaultIfEmpty()
select new {a.ProductName, GRP = GRP2};
foreach (var item in result)
{
Console.WriteLine("产品名称:" + item.ProductName);
Console.WriteLine("---------------------------------");
Console.WriteLine("供应商编号:" + item.GRP.ShipperId);
Console.WriteLine("供应商名称:" + item.GRP.CompanyName);
Console.WriteLine("联系电话:" + item.GRP.Phone);
Console.WriteLine("---------------------------------");
}
//执行结束
st.Stop();
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
Console.ReadKey();
}
}
2.Lambda 写法
- 语法格式:(自己总结,不喜勿喷)
GroupJoin<TOuter,TInner,TKey,TResult>
(IEnumerable<TOuter>, //要联接的第一个序列。
IEnumerable<TInner>, //要与第一个序列联接的序列。
Func<TOuter,TKey>, //用于从第一个序列的每个元素提取联接键的函数。
Func<TInner,TKey>, //用于从第二个序列的每个元素提取联接键的函数。
Func<TOuter,IEnumerable<TInner>, //用于从第一个序列的元素和第二个序列的匹配元素集合中创建结果元素的函数。
TResult>); //结果元素的类型。
实体对象.GroupJoin(联接第一个实体,
第一个实体联接,
从第一个实体的每个元素提取联接键的函数,
(变量1,变量2)=> new {查询字段};
);
- 具体实例
static void GroupJoinQuery()
{
//上下文依赖
using(DatabaseContext _db=new DatabaseContext())
{
//声明Stopwatch
Stopwatch st=new Stopwatch();
//执行开始
st.Start();
//实体1
var mdl=_db.productus.ToList();
//实体2
var md2=_db.shippers.ToList();
var result=mdl.GroupJoin(md2,a => a.SupplierId,cs => cs.ShipperId,(a, c) => new
{
pname = a.ProductName,
sname = c
});
foreach (var item in result)
{
Console.WriteLine($"{item.pname}");
foreach (var items in item.sname)
{
Console.WriteLine($"{items.CompanyName}");
}
}
//执行停止
st.Stop();
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
Console.ReadKey();
}
}
七、排序分页
1.Linq 写法
- 语法格式:(自己总结,不喜勿喷)
IQueryable<实体对象> 变量名称=(from (变量) in 上下文.实体对象 orderby 变量.字段 select (变量)).Skip(0).Take(10);
返回IQueryable<T>;
- 具体实例
static void OrderByPageQuery()
{
//上下文依赖
using(DatabaseContext _db=new DatabaseContext())
{
//声明Stopwatch
Stopwatch st=new Stopwatch();
//执行开始
st.Start();
//查询前五条记录
var result=(from q in _db.shippers
orderby q.ShipperId
select q).Skip(0).Take(5);
//输出
foreach (var item in result)
{
Console.WriteLine("供应商编号:" + item.ShipperId);
Console.WriteLine("供应商名称:" + item.CompanyName);
Console.WriteLine("联系电话:" + item.Phone);
Console.WriteLine("---------------------------------");
}
//执行结束
st.Stop();
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
Console.ReadKey();
}
}
2.Lambda 写法
- 语法格式
IQueryable<T> (变量)=上下文对象.OrderBy(lambda表达式).Ship(0).Take(5);
返回IQueryable<T>;
- 具体实例
static void OrderByPageQuery()
{
//上下文依赖
using(DatabaseContext _db=new DatabaseContext())
{
//声明Stopwatch
Stopwatch st=new Stopwatch();
//执行开始
st.Start();
//查询前五条记录
var result=_db.shippers.OrderBy(c => c.ShipperId).Skip(0).Take(5);
//输出
foreach (var item in result)
{
Console.WriteLine("供应商编号:" + item.ShipperId);
Console.WriteLine("供应商名称:" + item.CompanyName);
Console.WriteLine("联系电话:" + item.Phone);
Console.WriteLine("---------------------------------");
}
//执行结束
st.Stop();
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
Console.ReadKey();
}
}
学如逆水行舟,不进则退。持续学习ing....
Entity Framework 学习系列(5) - EF 相关查询的更多相关文章
- Entity Framework 学习系列(4) - EF 增删改
目录 写在前面 一.开发环境 二.创建项目 三.新增 1.单表新增 2.批量新增 3.多表新增 四.编辑 1.先查询,后编辑 2.创建实体,后编辑 五.删除 写在前面 在上一小节中,学习了如何 通过C ...
- Entity Framework学习笔记——配置EF
初次使用Entity Framework(以下简称EF),为了避免很快忘记,决定开日志记录学习过程和遇到的问题.因为项目比较小,只会用到EF的一些基本功能,因此先在此处制定一个学习目标:1. 配置EF ...
- Entity Framework 学习系列(3) - MySql Code First 开发方式+数据迁移
目录 # 写在前面 一.开发环境 二.创建项目 三.安装程序包 四.创建模型 五.连接字符串 六.编辑程序 七.数据迁移 写在最后 # 写在前面 这几天,一直都在学习Entity Framework ...
- Entity Framework 学习系列(1) - 认识理解Entity Framework
目录 写在前面 什么是Entity Framework EF的优缺点 1.优点 2.缺点 如何理解ORM EF执行的原理 写在前面 在使用.net mvc 开发的时候.为了高效的开发,我们常常会搭配O ...
- Entity Framework学习笔记(六)----使用Lambda查询Entity Framework(1)
请注明转载地址:http://www.cnblogs.com/arhat 在前几章中,老魏一直使用Linq来查询Entity Framework.但是老魏感觉,如果使用Linq的话,那么Linq的返回 ...
- Entity Framework 学习系列(2) - MySql Database First 开发方式
目录 写在前面 环境 下载MySQL连接工具 创建Databse First 1.创建控制台 2.创建数据库 3.安装 MySQL.Data 和MySQL.Data.Entity 3.在项目中添加数据 ...
- Entity Framework 学习整理(分播客整理)
MSDN: http://msdn.microsoft.com/en-us/data/aa937723 台湾博客: http://www.dotblogs.com.tw/yc421206/ http: ...
- Entity Framework 学习整理
MSDN: http://msdn.microsoft.com/en-us/data/aa937723 台湾博客: http://www.dotblogs.com.tw/yc421206/ http: ...
- Entity Framework入门系列(1)-扯淡开篇
这是我在Cnblogs上的第一个系列,但愿能坚持下去: 惯例索引 Entity Framework入门系列(1)-开篇兼索引: Entity Framework入门系列(2)-初试Code First ...
随机推荐
- SQL注入:Cookie注入
什么是Cookie Cookie就是代表你身份的一串字符串,网站根据Cookie来识别你是谁,如果你获取了管理员的Cookie,就表示你可以无需密码直接登陆管理员账号. Cookie注入的原理 在动态 ...
- HBuilder 云打包生成 .apk 文件所需的安卓证书如何获取以及文件打包前必须的设置
在 HBuilder 云打包功能中,生在 .apk 文件虽然平台提供了免费的 安卓证书,但如果有其它需求,比如想发布,那么就需要自己去申请各种类型的证书了,这里介绍几个工具,方便在线生成证书并配置到打 ...
- [TCP/IP] HTTPS的工作原理
一.首先HTTP请求服务端生成证书,客户端对证书的有效期.合法性.域名是否与请求的域名一致.证书的公钥(RSA加密)等进行校验: 二.客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数 ...
- I2C 挂死,SDA一直为低问题分析【转】
转自:https://blog.csdn.net/winitz/article/details/72460775 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...
- 使用ruamel.yaml库,解析yaml文件
在实现的需求如下: 同事提供了一个文本文件,内含200多个host与ip的对应关系,希望能在k8s生成pod时,将这些对应关系注入到/etc/hosts中. 网上看文档,这可以通过扩充pod中的hos ...
- 8-剑指offer: 替换空格
题目描述 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 代码: c ...
- 解析YAML文件
YamlMapFactoryBean yamlMapFactoryBean = new YamlMapFactoryBean(); yamlMapFactoryBean.setResources(ne ...
- Github实战测试情况
测试情况 很久没有熬夜测试程序了,经过测试,没有复现功能的有echo.葫芦娃.火鸡堂.那周余嘉熊掌将得队.为了交项目而干杯.修!咻咻!.云打印和追光的人.据汪老师反应在现场实践课程中大都能实现的,公平 ...
- day15_7.17正则表达式与re模块
一.正则表达式 在用户登录注册,以及身份验证时,会发现,如果在手机号的窗口输入字母等不是手机号的格式的字符串时,会报错,这种筛选字符串的功能就是由正则表达式提供. 正则表达式是几乎所有编程语言都会设计 ...
- CF1076D Edge Deletion 最短路树
问题描述 Codeforces 洛谷(有翻译) 题解 最短路树,是一棵在最短路过程中构建的树. 在\(\mathrm{Dijkstra}\)过程中,如果最终点\(y\)是由点\(x\)转移得到的,则在 ...