假设我有三个表:类别、项和CategoriesToItems
类别和项之间的关系是多到多的(通过CategoriesToItems表)。
假设我调用某个方法,在该方法的内部执行以下代码(立即强制查询执行/数据枚举):
var categories = context.Categories.ToList();
var items = context.Items.ToList();
var links = context.CategoriesToItems.ToList();在此之后,我立即开始对每种产品进行如下检查:
foreach(Category category in categories)
{
foreach(Item item in links.Select(l => l.Item))
{
//Do some stuff.
}
}为什么这些foreach循环会生成对数据库的查询?难道EF不应该知道所有必需的信息,因为我加载了类别、项和链接表条目?
有趣的是,如果我稍微改变一下,然后像这样加载数据
var items = context.Items.ToList();
var categories = context.Categories.Include("CategoriesToItems").ToList();当我想知道任何给定类别中的产品时,运行类似的循环并不会生成查询。
我关心的原因是,第一种方式加载数据的速度要快得多,但我必须在之后立即对数据执行操作,而且性能要慢得多(因为每次传递都会生成额外的查询)。
实际的include子句更复杂,因为我们需要来自几个不同表的数据,这就是为什么单独加载整个表比通过精心生成的多个联接查询加载整个表要快(我们需要它们中的所有数据)。在真正的应用程序中需要更多的表格(类别可以有标签,条目可以有标签,这两种关系都是多到多的--我相信你能理解这幅图--“做事情”部分实际上是在构建一本包含标签的条目/类别的字典,标签是继承的,所以一个带有X标记的类别意味着它的所有产品都被标记为X)。
为了概括/简化这一点:当我从所有涉及的表中加载每一行时,Entity为什么要生成关于关系的查询?有什么我能帮上忙的吗?
编辑:我应该补充一下,我假设它实际上是在调用数据库,因为在执行这些特定代码行时,ADO.NET查询条目会出现在LiveTrace中,而且性能明显不同。所以,如果我误解了这些LiveTrace条目的含义,那么我想我有一个不同的问题。
发布于 2012-01-27 09:08:58
在执行任何查询之前,尝试关闭延迟加载:
context.ContextOptions.LazyLoadingEnabled = false;https://stackoverflow.com/questions/9026579
复制相似问题