gpt4 book ai didi

c# - .Include() 与 .Load() 在 EntityFramework 中的表现

转载 作者:IT王子 更新时间:2023-10-29 03:44:49 31 4
gpt4 key购买 nike

当查询需要稍后在代码中访问导航属性的大表时(我明确地不想使用延迟加载)什么会更好地执行 .Include().Load()?或者为什么要用一个而不是另一个?

在这个例子中,被包含的表都只有大约 10 个条目,而 employees 有大约 200 个条目,并且可能会发生其中大部分无论如何都会使用 include 加载,因为它们匹配 where 子句。

Context.Measurements.Include(m => m.Product)
.Include(m => m.ProductVersion)
.Include(m => m.Line)
.Include(m => m.MeasureEmployee)
.Include(m => m.MeasurementType)
.Where(m => m.MeasurementTime >= DateTime.Now.AddDays(-1))
.ToList();

Context.Products.Load();
Context.ProductVersions.Load();
Context.Lines.Load();
Context.Employees.Load();
Context.MeasurementType.Load();

Context.Measurements.Where(m => m.MeasurementTime >= DateTime.Now.AddDays(-1))
.ToList();

最佳答案

看情况,两种都试试

当使用 Include() 时,您将获得好处,即在对基础数据存储的一次调用中加载所有数据。例如,如果这是一个远程 SQL Server,这可能会显着提高性能。

缺点Include() 查询往往会变得真的复杂,尤其是如果您有任何过滤器(例如 Where() 调用)或尝试进行任何分组。 EF 将使用子SELECTAPPLY 语句生成非常嵌套的查询,以获取您想要的数据。它的效率也低得多——您返回一行数据,其中包含每个可能的子对象列,因此顶级对象的数据将重复很多次。 (例如,一个有 10 个子对象的父对象将生成 10 行,每行都具有父对象列的相同数据。)我曾遇到过单个 EF 查询变得如此复杂以至于导致死锁的情况与 EF 更新逻辑同时运行。

Load() 方法简单。每个查询都是针对单个表的单个、简单、直接的 SELECT 语句。这些在所有可能的方式上都容易得多,除了您必须做很多(可能多很多倍)。如果您有嵌套的集合集合,您甚至可能需要遍历顶级对象并加载它们的子对象。它可能会失控。

快速经验法则

尽量避免在单个查询中有任何三个以上的Include 调用。我发现 EF 的查询变得太丑陋以至于无法识别;它也符合我对 SQL Server 查询的经验法则,即在单个查询中最多使用四个 JOIN 语句效果很好,但之后是考虑重构的时候了。

然而,所有这些都只是一个起点。

这取决于您的模式、您的环境、您的数据以及许多其他因素。

最后,您只需要尝试各种方式

选择一个合理的“默认”模式来使用,看看它是否足够好,如果不够好,则根据口味进行优化。

关于c# - .Include() 与 .Load() 在 EntityFramework 中的表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19319116/

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