EntityFramework优化:查询性能
1. 禁用延迟加载
延迟加载是常见的方式,Entity Framework在需要时可以自动为一个实体的实例获取关联的数据。
Entity Framework自动延迟加载需要同时满足以下3个条件:
(1)DbContext.Configuration.LazyLoadingEnabled = true (默认为true)
(2)DbContext.Configuration.ProxyCreationEnabled = true (默认为true)
(3)POCO类必须是public而非sealed,且集合属性使用Virtual修饰,这样Entity Framework才能Override以包含延迟加载。
延迟加载示例:
using (var ctx = new LibingContext())
{
var category = ctx.Categories.Find();
foreach (var product in category.Products)
{
Console.WriteLine(product.ProductName);
}
}
EntityFramework禁用延迟加载:
public class LibingContext : DbContext
{
public LibingContext()
: base("Name=LibingContext")
{
// 禁用延迟加载
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
}
}
2. AsNoTracking()与Attach()
对于只读操作,强烈建议使用AsNoTracking进行数据获取,降低数据获取所需的时间。
由于没有受到DbContext的跟踪,利于对数据及时性要求高的数据查询。
使用AsNoTracking查询出来的数据,要进行删除时,需使用Attach()。
using (var ctx = new LibingContext())
{
var products = ctx.Products
.AsNoTracking()
.ToList(); var product = products.Where(t => t.ProductID == ).FirstOrDefault(); //// 修改不用Attach
//product.ProductName = "新名称";
//ctx.Entry(product).State = EntityState.Modified; ctx.Set<Product>().Attach(product);
ctx.Entry(product).State = EntityState.Deleted; ctx.SaveChanges();
}
注:查询过程Select映射不需要加AsNoTracking()
var products = ctx.Products
.Select(t => new { t.ProductID, t.ProductName })
.ToList();
3. AsNonUnicode
using (var ctx = new LibingContext())
{
var products = ctx.Products
.Where(t => t.ProductName == "商品")
.ToList();
}
SELECT
[Extent1].[ProductID] AS [ProductID],
[Extent1].[CategoryID] AS [CategoryID],
[Extent1].[ProductName] AS [ProductName],
[Extent1].[UnitPrice] AS [UnitPrice],
[Extent1].[UnitsInStock] AS [UnitsInStock]
FROM [dbo].[Product] AS [Extent1]
WHERE N'商品' = [Extent1].[ProductName]
using System.Data.Entity;
using (var ctx = new LibingContext())
{
var products = ctx.Products
.Where(t => t.ProductName == DbFunctions.AsNonUnicode("商品"))
.ToList();
}
SELECT
[Extent1].[ProductID] AS [ProductID],
[Extent1].[CategoryID] AS [CategoryID],
[Extent1].[ProductName] AS [ProductName],
[Extent1].[UnitPrice] AS [UnitPrice],
[Extent1].[UnitsInStock] AS [UnitsInStock]
FROM [dbo].[Product] AS [Extent1]
WHERE '商品' = [Extent1].[ProductName]
EF正常情况生成的SQL会在前面带上“N”,加上DbFunctions.AsNonUnicode生成的SQL没有“N”。“N”是将字符串作为Unicode格式进行存储。
.Net字符串是Unicode格式,SQL中带“N”会进行数据转换,无法使用索引,只能全表扫描。
DbFunctions.AsNonUnicode()让.Net将其作为一个非Unicode来处理。
在进行字符串查找或者比较时建议用AsNonUnicode()方法来提高查询性能。
4. 使用AutoMapper查询DTO
查询需要的字段:DTO
using AutoMapper;
using AutoMapper.QueryableExtensions;
using (var ctx = new LibingContext())
{
Mapper.Initialize(cfg => cfg.CreateMap<Product, ProductDTO>()); var products = ctx.Products
.ProjectTo<ProductDTO>()
.ToList();
}
EntityFramework优化:查询性能的更多相关文章
- Redis 优化查询性能
一次使用 Redis 优化查询性能的实践 应用背景 有一个应用需要上传一组ID到服务器来查询这些ID所对应的数据,数据库中存储的数据量是7千万,每次上传的ID数量一般都是几百至上千数量级别. 以前 ...
- 【分布式搜索引擎】Elasticsearch如何部署以及优化查询性能
一.Elasticsearch生产集群如何部署 (1)es生产集群部署5台机器,若每台机器是6核64G的,那么集群总内存是320G (2)假如我们es集群的日增量数据大概是2000万条,每天日增量数据 ...
- 一次使用 Redis 优化查询性能的实践
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,一次使用 Redis 优化查询性能的实践 应用背景 有一个应用需要上传一组ID到 ...
- 最新IP数据库 存储优化 查询性能优化 每秒解析上千万
高性能IP数据库格式详解 每秒解析1000多万ip qqzeng-ip-ultimate.dat 3.0版 编码:UTF8 字节序:Little-Endian 返回规范字段(如:亚洲|中国| ...
- 【MVC+MySQL+EntityFramework】查询性能优化笔记
通过在DbContext中定了表之间的关系,查询后在View中通过item.ProjectOverHour来显示关联表数据. modelBuilder.Entity<ProjectOverHou ...
- 使用Spring Ehcache二级缓存优化查询性能
最近在对系统进行优化的时候,发现有些查询查询效率比较慢,耗时比较长, 通过压测发现,主要耗费的性能 消耗在 查询数据库,查询redis 数据库:连接池有限,且单个查询不能消耗大量的连接池,占用大量IO ...
- Sql Server查询性能优化之不可小觑的书签查找
小小程序猿SQL Server认知的成长 1.没毕业或工作没多久,只知道有数据库.SQL这么个东东,浑然分不清SQL和Sql Server Oracle.MySql的关系,通常认为SQL就是SQL S ...
- SQL Server-聚焦过滤索引提高查询性能(十)
前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...
- SQL Server-聚焦过滤索引提高查询性能
前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...
- 提升50%!Presto如何提升Hudi表查询性能?
分享一篇关于使用Hudi Clustering来优化Presto查询性能的talk talk主要分为如下几个部分 演讲者背景介绍 Apache Hudi介绍 数据湖演进和用例说明 Hudi Clust ...
随机推荐
- linux部署二:网卡配置和Yum源的替换
一,初次登陆: 1.登陆(用root登陆)(1).账户名root(2).密码 ....2.工作界面切换A.Ctrl + alt + F1 : 图形化界面B.Ctrl + alt + F2----F6 ...
- Oracle11g: datetime
--上一月,上一年 select add_months(sysdate,-1) last_month,add_months(sysdate,-12) last_year from dual; --下一 ...
- asp.net/wingtip/显示数据和详细信息
前边我们的工作处于wingtip工程基础建设阶段,先是建立了“数据访问层”,然后设计建设了“UI和导航”的框架,接下来要充实工程的内容,显示“数据和详细信息”. 一. 添加数据控件(Data Cont ...
- ES6常用
ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准. 因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015(简称ES2015).虽然浏览器在不 ...
- MTK Android O1平台预置apk
在MTK Android O1平台预置apk为可卸载时.预置到旧的路径system/vendor/operator/app会编译报错,"You cannot install files to ...
- 一个表里有多个字段需要同时使用字典表进行关联显示,如何写sql查询语句
参考:https://bbs.csdn.net/topics/330032307 数据库里面有一个字典表,这张表里面有id段和对应的名字字段.在另外一个记录的表里面有对应的上述字典表的id,而且有多个 ...
- 【Eclipse】springMVC介绍与配置
SpringMCV介绍: Spring MVC是一种基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动的,也就是使用 ...
- Python 函数调用&定义函数&函数参数
一.函数调用 在python中内置了很多函数,我们可以直接调用 .想要调用函数首先要知道函数的名称及包含的参数,还可以通过查看python官方的文档:https://docs.python.org/3 ...
- Netty初体验
package netty_starter; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFut ...
- echarts柱状图点击阴影部分触发事件
在很多时候我们的柱状图分布不均匀,有些柱高可能会很小,如果通过myChart.on('click',function(){})来促发事件,可能在点击的时候不好操作,因为这个click事件是绑定在各个s ...