作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我听到的关于 EF4 与 NHibernate 的少数有效提示之一是,EF4 无法处理延迟加载的集合。例如,在延迟加载的集合上,如果我说:
if (MyAccount.Orders.Count() > 0) ;
select count(*)
select n + 1
问题。据我了解,最接近的 EF4 是使用 Include 方法。
最佳答案
你描述的不是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/
我是一名优秀的程序员,十分优秀!