【发布时间】:2011-11-23 06:43:26
【问题描述】:
这是此处解释的问题的第二步:EF 4.1 code-first: How to load related data (parent-child-grandchild)?。 在@Slauma的指导下,我用这种方法成功地检索到了数据:
var model = DbContext.SitePages
.Where(p => p.ParentId == null && p.Level == 1)
.OrderBy(p => p.Order) // ordering parent
.ToList();
foreach (var child in model) { // loading children
DbContext.Entry(child)
.Collection(t => t.Children)
.Query()
.OrderBy(t => t.Order) // ordering children
.Load();
foreach (var grand in child.Children) { // loading grandchildren
DbContext.Entry(grand)
.Collection(t => t.Children)
.Query()
.OrderBy(t => t.Order) // ordering grandchildren
.Load();
}
}
虽然这种方法有效,但它会向数据库发送许多查询,我正在寻找一种方法来在一个查询中完成所有这些操作。在@Slauma 的指导下(在上面链接的答案中进行了解释),我将查询更改为这个:
var model2 = DbContext.SitePages
.Where(p => p.ParentId == null && p.Level == 1)
.OrderBy(p => p.Order)
.Include(p => p.Children // Children: how to order theme???
.Select(c => c.Children) // Grandchildren: how to order them???
).ToList();
现在,我如何在选择子(和孙子)时对其进行排序(如上面的第一个代码示例所示)?
【问题讨论】:
-
看看这个问题:stackoverflow.com/questions/4156949/…。您正在尝试做的事情称为“急切加载”,显然,您不能将
OrderBy与Include一起使用。 -
是的,我知道急切加载,如果您查看第一个代码(由我自己创建),您会看到我在每个级别的每个对象上都使用了 foreach 语句(顶部为孩子,并且,孙子的孩子)与您准备好的链接中解释的相同。但这需要对数据库进行更多查询!我正在寻找一种在一个查询中完成所有操作的方法,而不是更多!
-
您能否急切地加载整个结构,然后在需要时在视图中进行排序?几乎没有理由在数据访问逻辑中泄露表示逻辑(排序)。
-
只有一个原因:避免多次循环。这里有很多
foreach循环,我想避免它们。在查询数据库或视图时,它们之间没有任何区别,我们将拥有:foreach(foreach())。很抱歉,我无法解释更多): -
但我认为最后,我必须这样做。通过
Include(Select())选择所有这些,然后订购它们。再次感谢您的关注。
标签: entity-framework entity-framework-4.1 ef-code-first parent-child