Entity Framework with MySQL 学习笔记一(查询)
参考 : http://msdn.microsoft.com/en-us/data/jj574232.aspx
EF 查询基本上有3中
默认是 Lazy Loading
特色是只有在需要数据的时候EF才会像数据库请求,它不会使用任何inner join
比如我们有一个产品,有很多颜色,(1对多)
那么我们想把每个产品和颜色统统选出来
using (EFDB db = new EFDB())
{
var prods = db.prods.ToList(); //像数据库请求prods, 但是不会包括colors
foreach (var prod in prods)
{
var color = prod.colors; //每一次都像数据库请求颜色
}
}
首先必须用 ToList(),不然之后的 prod.colors是会报错的。
如果prods有很多,它会发出很多次请求,这对性能是有影响的!
Opened connection at // :: +:
SELECT
`Extent1`.`id`,
`Extent1`.`color`,
`Extent1`.`prod_id`
FROM `prod_color` AS `Extent1`
WHERE `Extent1`.`prod_id` = @EntityKeyValue1
-- EntityKeyValue1: '' (Type = Int32, IsNullable = false)
-- Executing at // :: +:
-- Completed in ms with result: EFMySqlDataReader Closed connection at // :: +:
Opened connection at // :: +:
SELECT
`Extent1`.`id`,
`Extent1`.`color`,
`Extent1`.`prod_id`
FROM `prod_color` AS `Extent1`
WHERE `Extent1`.`prod_id` = @EntityKeyValue1
-- EntityKeyValue1: '' (Type = Int32, IsNullable = false)
-- Executing at // :: +:
-- Completed in ms with result: EFMySqlDataReader Closed connection at // :: +:
Opened connection at // :: +:
SELECT
`Extent1`.`id`,
`Extent1`.`color`,
`Extent1`.`prod_id`
FROM `prod_color` AS `Extent1`
WHERE `Extent1`.`prod_id` = @EntityKeyValue1
-- EntityKeyValue1: '' (Type = Int32, IsNullable = false)
-- Executing at // :: +:
-- Completed in ms with result: EFMySqlDataReader Closed connection at // :: +:
所以通常我们不是很喜欢用lazy loading
第2种呢是 Eagerly Loading
它主要是使用了 Include 方法来调用 inner join ,使查询次数减少
using (EFDB db = new EFDB())
{
db.Configuration.LazyLoadingEnabled = false;
var prods = db.prods.Include(p => p.colors).ToList(); //像数据库请求prods和colors
//var prods = db.prods.Include(p => p.colors.Select(c => c.sizes)).ToList(); 如果还有sizes
foreach (var prod in prods)
{
var color = prod.colors; //不需要再请求了
}
}
Opened connection at // :: +:
SELECT
`Project1`.`id`,
`Project1`.`code`,
`Project1`.`name`,
`Project1`.`C1`,
`Project1`.`id1`,
`Project1`.`color`,
`Project1`.`prod_id`
FROM (SELECT
`Extent1`.`id`,
`Extent1`.`code`,
`Extent1`.`name`,
`Extent2`.`id` AS `id1`,
`Extent2`.`color`,
`Extent2`.`prod_id`,
CASE WHEN (`Extent2`.`id` IS NULL) THEN (NULL) ELSE () END AS `C1`
FROM `prod` AS `Extent1` LEFT OUTER JOIN `prod_color` AS `Extent2` ON `Extent1`.`id` = `Extent2`.`prod_id`) AS `Project1`
ORDER BY
`Project1`.`id` ASC,
`Project1`.`C1` ASC
-- Executing at // :: +:
-- Completed in ms with result: EFMySqlDataReader Closed connection at // :: +:
语句很吓人,子查询都出来了。我想对数据库人员来说,这查询决定是不合格的...
这里有一件事要特别注意 :
当我们使用多层多个坎套 include 的时候
var zz = db.dailyRooms.Include("offers").Include("room.imgs").Include("room.facilities").ToList();
var zzz = db.dailyRooms.Include("room.imgs").Include("room.facilities").Include("offers").ToList();
这2行代码只是include的顺序调换了,但是第一句会error,第2句可以执行,这里遇到的error是 TINYINT 无法被转换成 bool
我没有研究它生产的语句,但是我大概猜是因为在多个坎套的情况语句会影响类型,导致无法正常转换 TINYINT 可能变成string了。
推出解决方案是尽可能先include自己属性,才去坎套
有机会我才深入理解一下(清楚的人请在这指点,感激!)
第3种是 Explicitly Loading
这个和 lazy loading 差不多,只是可以手动去控制
using (EFDB db = new EFDB())
{
db.Configuration.LazyLoadingEnabled = false;
//var prods = db.prods.Include(p => p.colors).ToList(); //像数据库请求prods和colors
//var prods = db.prods.Include(p => p.colors.Select(c => c.sizes)).ToList(); 如果还有sizes
var prods = db.prods.ToList();
foreach (var prod in prods)
{
var color = prod.colors; //null
db.Entry(prod).Collection(p => p.colors).Load(); //像数据库发送请求
//db.Entry(prod).Collection(p => p.colors).Query().Where(c => c.color == "red").Load(); //加过滤的话
color = prod.colors; //有了
}
}
Opened connection at // :: +:
SELECT
`Extent1`.`id`,
`Extent1`.`code`,
`Extent1`.`name`
FROM `prod` AS `Extent1`
-- Executing at // :: +:
-- Completed in ms with result: EFMySqlDataReader Closed connection at // :: +:
Opened connection at // :: +:
SELECT
`Extent1`.`id`,
`Extent1`.`color`,
`Extent1`.`prod_id`
FROM `prod_color` AS `Extent1`
WHERE `Extent1`.`prod_id` = @EntityKeyValue1
-- EntityKeyValue1: '' (Type = Int32, IsNullable = false)
-- Executing at // :: +:
-- Completed in ms with result: EFMySqlDataReader Closed connection at // :: +:
Opened connection at // :: +:
SELECT
`Extent1`.`id`,
`Extent1`.`color`,
`Extent1`.`prod_id`
FROM `prod_color` AS `Extent1`
WHERE `Extent1`.`prod_id` = @EntityKeyValue1
-- EntityKeyValue1: '' (Type = Int32, IsNullable = false)
-- Executing at // :: +:
-- Completed in ms with result: EFMySqlDataReader Closed connection at // :: +:
Opened connection at // :: +:
SELECT
`Extent1`.`id`,
`Extent1`.`color`,
`Extent1`.`prod_id`
FROM `prod_color` AS `Extent1`
WHERE `Extent1`.`prod_id` = @EntityKeyValue1
-- EntityKeyValue1: '' (Type = Int32, IsNullable = false)
-- Executing at // :: +:
-- Completed in ms with result: EFMySqlDataReader Closed connection at // :: +:
Opened connection at // :: +:
SELECT
`Extent1`.`id`,
`Extent1`.`color`,
`Extent1`.`prod_id`
FROM `prod_color` AS `Extent1`
WHERE `Extent1`.`prod_id` = @EntityKeyValue1
-- EntityKeyValue1: '' (Type = Int32, IsNullable = false)
-- Executing at // :: +:
-- Completed in ms with result: EFMySqlDataReader Closed connection at // :: +:
原始方法调用 select
using (DB db = new DB())
{
List<Color> colors = db.Database.SqlQuery<Color>("select * from color where id in ({0})",).ToList();
}
也是用了很多的查询...
目前我还没有找到比较可以接受的查询方式。至少我觉得对性能有点要求的人应该不会使用上面任何一种方法吧..
继续专研...待续
Entity Framework with MySQL 学习笔记一(查询)的更多相关文章
- Entity Framework with MySQL 学习笔记一(安装)
声明 : 数据库是Mysql,本人的程度只到会写sql语句(不会储蓄过程), c# 会基本的ADO.NET数据库访问,LINQ基础. 这篇只做个人学习|温习作用. 新手可以参考,也请高手指正错误, ...
- Entity Framework with MySQL 学习笔记一(乐观并发)
在做项目时,通常我们对乐观并发有几种处理模式 1. 告诉用户此数据已被其他人捷足先登,更改了.你就算新一下重来吧. 2.直接把数据覆盖上去,我最大. 3.用被人的数据. 这里给出 code first ...
- Entity Framework with MySQL 学习笔记一(查看EF和SQL请求日志)
做数据库的一向来都会很注意请求的次数还有语句.这关系到很多性能的问题. 因此在使用EF的时候如果不了解原理很可能会搞出很糟糕的请求. 所以呢,在还没有搞懂EF前最基本的是你得"看得见&quo ...
- Entity Framework with MySQL 学习笔记一(拦截)
参考 : http://msdn.microsoft.com/en-us/data/dn469464.aspx EF 允许我们在发送SQL请求和返回数据时做一些拦截的动作 比如可以自定义写 log , ...
- Entity Framework with MySQL 学习笔记一(验证标签)
直接上代码 [Table("single_table")] public class SingleTable { [Key] public Int32 id { get; set; ...
- Entity Framework with MySQL 学习笔记一(复杂类型 Complex Types)
有时候我们希望在sql一个表里面的column, 一部分被分化成另一个class 典型的例子是 Address 直接看代码: [Table("member")] public cl ...
- Entity Framework with MySQL 学习笔记一(继承)
基本上sql中要表示继承关系有3中方式. 分别是,1表继承(TPH),2表继承(TPC),3表继承(TPT) 1表 : Person id type name classroom office 1 s ...
- Entity Framework with MySQL 学习笔记一(关系整理版)
1-1 设置 //DataAnnotation 1-1 | 1-0 table //SQLtable : member , columns : memberId, name //SQL basic l ...
- Entity Framework with MySQL 学习笔记一(insert,update,delete)
先说说 insert 吧. 当EF执行insert时,如果我们传入的对象是有关联(1对多等)的话,它会执行多个语句 insert到多个表, 并且再select出来填充我们的属性(因为有些column默 ...
随机推荐
- UVALive 4959 Jumping monkey
题意就是: 一个猎人在森林里捕猎. 然后有只猴子,喜欢躲树的后边,猎人看不见它 然后给出了一张图,表示有哪些树是相邻的. 数据保证任意图中两个树都可以直接或间接的到达 猎人有一个枪,每次他可以选择一颗 ...
- 不用外部JAR包,自己实现JSP文件上传!
看书上(JSP应用与开发技术)使用JSP文件上传,写了个真无语,压根就有很多问题,上传500KB的文件传过去后只剩350KB,而且编码必须是GBK.GB2312,否则传过去的文件都数据截取不正确. 琢 ...
- Object -C NSSet -- 笔记
// // main.m // NSSET // // Created by facial on 25/8/15. // Copyright (c) 2015 facial_huo. All ...
- JVM调优之jstack找出最耗cpu的线程并定位代码
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多.下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有 ...
- 新版福昕阅读器(Foxit Reader)启动速度慢解决办法
新版福昕阅读器(FoxitReader)启动速度慢解决办法之前喜欢使用福昕阅读器的原因就是看中了其小巧,可是最近版本的阅读器打开速度变得慢了很多(不是电脑配置问题),比AdobeReader还要慢,这 ...
- 一起来写2048(160行python代码)
前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家,而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到20 ...
- Java集合类具体解释
假设您喜欢这些文章,欢迎点击此处订阅本Blog 集合类说明及差别 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Ma ...
- 二维码_encode与decode
二维码encode和decode工具类 import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.Buffere ...
- Html.RenderPartial与Html.RenderAction区别(转)
Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的. Html.RenderPartial是直接将用户控件嵌入到界面上: <%Htm ...
- SQL 2008R2 日期转换
--SQL CONVERT日期转换 print GETDATE() --相同 Select CONVERT(varchar(100), GETDATE(), 0) AS NDateTime --: 0 ...