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 ...
随机推荐
- Java开发笔记(四十九)关键字super的用法
前面介绍了如何从Bird类继承而来Swallow类,按道理子类应当继承父类的所有要素,但是对于构造方法来说,Swallow类仅仅继承了Bird类的默认构造方法,并未自动继承带参数的构造方法.如果子类想 ...
- 上传漏洞总结-upload-labs
介绍: Upload-labs是一个所有类型的上传漏洞的靶场 项目地址:https://github.com/c0ny1/upload-labs 思维导图: 小试牛刀: Pass-01 客户端js检查 ...
- Kotlin入门(33)运用扩展属性
进行App开发的时候,使用震动器要在AndroidManifest.xml中加上如下权限: <!-- 震动 --> <uses-permission android:name=&qu ...
- spring学习总结——高级装配学习一(profile与@Conditional)
前言: 在上一章装配Bean中,我们看到了一些最为核心的bean装配技术.你可能会发现上一章学到的知识有很大的用处.但是,bean装配所涉及的领域并不仅仅局限于上一章 所学习到的内容.Spring提供 ...
- ASP.NET Core 入门教程 10、ASP.NET Core 日志记录(NLog)入门
一.前言 1.本教程主要内容 ASP.NET Core + 内置日志组件记录控制台日志 ASP.NET Core + NLog 按天记录本地日志 ASP.NET Core + NLog 将日志按自定义 ...
- PJProject(2.6) 工程介绍
pjlib pjlib\build\pjlib.vcproj pjlib_test pjlib\build\pjlib_test.vcproj pjsip_core pjsip\build\pjsip ...
- python 通过元类控制类的创建
一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...
- [20190401]跟踪dbms_lock.sleep调用.txt
[20190401]跟踪dbms_lock.sleep调用.txt --//自己在semtimedop函数调用理解错误,加深理解,跟踪dbms_lock.sleep调用的情况. 1.环境:SCOTT@ ...
- python ----面向对象的三大特性---多态
多态 多态 不同的子类对象调用相同的父类方法,产生不同的执行结果. 以继承和重写父类方法为前提
- LeetCode算法题-Construct String from Binary Tree(Java实现)
这是悦乐书的第273次更新,第288篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第141题(顺位题号是606).构造一个字符串,该字符串由二叉树中的括号和整数组成,并具 ...