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 ...
随机推荐
- 我的第三个开源库GuaJiangViewDemo——中文文档
GuaJiangViewDemo 欢迎Star 一个可以简单的刮刮奖View的封装 测试图 使用 1.在根目录上添加 maven { url 'https://jitpack.io' } 2.添加依赖 ...
- Xamarin for Visual Studio下载后的文件路径
Xamarin for Visual Studio的下载很纠结,在官网上不知道如何下载?现在找到一个办法:可以先在网上找一个低版本的之后安装,然后利用VS更新.利用VS更新这里也遇到了问题,下载成功之 ...
- DVWA 黑客攻防演练(一) 介绍及安装
原本是像写一篇 SELinux 的文章的.而我写总结文章的时候,总会去想原因是什么,为什么会有这种需求.而我发觉 SELinux 的需求是编程人员的神奇代码或者维护者的脑袋短路而造成系统容易被攻击.就 ...
- PJSUA2开发文档--第十二章 PJSUA2 API 参考手册
12 PJSUA2 API 参考手册 12.1 endpoint.hpp PJSUA2基本代理操作. namespace pj PJSUA2 API在pj命名空间内. 12.1.1 class En ...
- 常用SMTP地址
1.QQ邮箱(mail.qq.com) POP3服务器地址:pop.qq.com(端口:110) SMTP服务器地址:smtp.qq.com(端口:25) 2.搜狐邮箱(sohu.com): POP3 ...
- asp.net --> 初识WCF
对于刚开始接触wcf的同志,可以有效的理解wcf的使用场景. 引用该文章(点击查看),简单的介绍wcf的使用.另一篇文章(点击查看),和上述文章内容差不多.
- System.map文件的作用
有关System.map文件的信息好象很缺乏.其实它一点也不神秘,并且在整个事情当中它并不象看上去那么得重要.但是由于缺乏必要的文档说明,使其显得比较神秘.它就象耳垂,我们每个人都有,但却不知道是干什 ...
- Windows程序设计:格式化对话框的设计
刚开始学习Windows程序设计,磕磕碰碰,先做个小笔记缓缓神经,主要是将MessageBox这个Windows API函数的. MessageBox函数是许多人刚开始学习Windows程序设计或者是 ...
- LeetCode算法题-Reverse Words in a String III(Java实现)
这是悦乐书的第259次更新,第272篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第126题(顺位题号是557).给定一个字符串,您需要反转句子中每个单词中的字符顺序,同 ...
- php分页实现
<?php header("content-type:text/html;charset=utf8"); include 'conn.php'; //每页显示的数据条数 $p ...