gpt4 book ai didi

c# - 优化 Entity framework Query,避免延迟加载

转载 作者:太空宇宙 更新时间:2023-11-03 10:33:50 24 4
gpt4 key购买 nike

我有一个需要几秒钟(~2.6 秒)才能运行的 linq 查询。但我想尽可能减少它。

我只需要阅读,所以我包含了 .AsNoTracking() 行为。

我还测试了不带 include 语句的查询,但是在 get 请求之后我的操作进一步减慢了它的速度,所以我留下了 include 来优化我的其他操作。

主要目标是减少数据库对话,因此减少 ToList(),Include 语句。

代码:

var obj = _context.MyContextModel.AsNoTracking()
.Where(x => x.CategoryList.Model.Id == 1)
.Where(x => x.CategoryList.Model.TypeId == 1)
.Where(x => x.Year.Select(y=>y.Datetime).Any(item => item.Year == 2010))
.Include(x => x.LinkedMarket).AsNoTracking()
.Include(x => x.Year).AsNoTracking()
.Include(x => x.CategoryList).AsNoTracking()
.Include(x => x.CategoryList.Model).AsNoTracking();

return obj.AsParallel().ToList();

此操作通常返回大约 1000-2000 条 MyContextModel 记录,不包括“includes”

我该如何进一步优化它?我应该将对象加载到容器类吗?还是其他解决方案?

更新

_context.Configuration.ProxyCreationEnabled = false;
_context.Configuration.LazyLoadingEnabled = false;
var obj = _context.MyContextModel.AsNoTracking()
.Where(x => x.CategoryList.Model.Id == 1)
.Where(x => x.CategoryList.Model.TypeId == 1)
.Where(x => x.LinkedMarket.FirstOrDefault(mar=>mar.MarketID == marketId) != null)
.Include(x => x.Year).AsNoTracking()
.Include(x => x.CategoryList).AsNoTracking()
.Include(x => x.CategoryList.Model).AsNoTracking();

return obj.AsParallel().ToList();

基本上我已经删除了过滤年份的 where 子句(我稍后再做,因此包括年份)我添加了一个从 getgo 指定市场的 Where 子句。

我删除了包含市场的 Include。

一个大的性能小偷是链接市场(我不知道为什么,EF 不喜欢。)

这将查询减少到大约平均 0.4 秒。整个操作时间从 4+ 秒缩短到惊人的 0.7 秒。

最佳答案

您执行的每个包含操作都将以在数据库中执行的连接结束。假设您的左表非常大,记录大小为 1024 字节,并且您有很多详细信息,比如 1000,而详细记录大小仅为 100。这将导致左表的信息重复 1000 次,此信息将由数据库传输到网络上,EF 必须过滤掉重复的信息以创建您的左实例。

最好不要使用 include 并进行显式加载。基本上在同一上下文中执行 2 个查询。

我在下面有一个使用这个原则的例子。它可以比依赖 include 快 10 倍。 (一个数据库只能有效地处理有限数量的连接)

var adressen = adresRepository
.Query(r => r.RelatieId == relatieId)
.Include(i => i.AdresType)
.Select().ToList();

var adresids = (from a in adressen select a.AdresId).ToList();
IRepositoryAsync<Comm> commRepository = unitOfWork.RepositoryAsync<Comm>();

var comms = commRepository
.Query(c => adresids.Contains(c.AdresId))
.Include(i => i.CommType)
.Select();

对于我使用 include 的 commType 和 adresType,因为存在一对一的关系,我避免了过多的连接,因此我的多个查询将比使用 include 的单个查询更快。我没有在第一个查询中包括 Comms 以尝试避免第二个查询,重点是在这种情况下 2 个查询比单个查询更快。

最重要的是,除了避免延迟加载之外,还有更多需要考虑的因素,还需要考虑哪些需要包含哪些不需要。您可能需要该信息,并且包含既快速又简单,但在同一上下文中进行额外查询可能会更快。

关于c# - 优化 Entity framework Query,避免延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28700414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com