gpt4 book ai didi

entity-framework - 在下一个 Entity Framework 中选择 N+1

转载 作者:行者123 更新时间:2023-12-03 11:28:04 25 4
gpt4 key购买 nike

我听到的关于 EF4 与 NHibernate 的少数有效提示之一是,EF4 无法处理延迟加载的集合。例如,在延迟加载的集合上,如果我说:

if (MyAccount.Orders.Count() > 0) ;

EF 将拉下整个集合(如果还没有),而 NH 将足够聪明地发出 select count(*)
NH 也有一些不错的批量提取来帮助处理 select n + 1问题。据我了解,最接近的 EF4 是使用 Include 方法。

EF 团队是否有任何迹象表明这将在下一次迭代中修复?我知道他们正在努力研究 POCO,但这似乎是一个流行的修复方法。

最佳答案

你描述的不是N+1问题。 N+1 问题的例子是 here . N+1 意味着您执行 N+1 个选择而不是一个(或两个)。在您的示例中,它很可能意味着:

// Lazy loads all N Orders in single select
foreach(var order in MyAccount.Orders)
{
// Lazy loads all Items for single order => executed N times
foreach(var orderItem in order.Items)
{
...
}
}
这很容易解决:
// Eager load all Orders and their items in single query
foreach(var order in context.Accounts.Include("Orders.Items").Where(...))
{
...
}
你的例子对我来说是有效的。你有一个公开的集合 IEnumerable然后你执行 Count对其进行操作。 Collection 是延迟加载的,count 在内存中执行。将 Linq 查询转换为 SQL 的功能仅在 IQueryable 上可用用表示查询的表达式树。但是 IQueryable表示查询 = 每次访问意味着在 DB 中执行新的操作,因此例如在循环中检查 Count 将在每次迭代中执行 DB 查询。
所以更多的是关于动态代理的实现。

使用 DbContext 时,在 Code-first CTP5(最终版本将称为 EF 4.1)中已经可以计算相关实体而不加载它们。而不是 ObjectContext但不是通过与收藏的直接互动。你将不得不使用类似的东西:
int count = context.Entry(myAccount).Collection(a => a.Orders).Query().Count();
Query方法返回准备好的 IQueryable如果您使用延迟加载,这可能是 EF 运行的内容,但您可以进一步修改查询 - 在这里我使用了 Count .

关于entity-framework - 在下一个 Entity Framework 中选择 N+1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5070013/

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