有条件的急切加载?

ale*_*dev 11 entity-framework entity-framework-4

我想有条件地加载一个实体和它的孩子(我只想在child.IsActive == true时急切地加载孩子).我该如何执行以下操作?

var parent = 
    from p in db.tblParents.Include("tblChildren") <-- where tblChildren.IsActive == true
    where p.PrimaryKey == 1
    select p;
Run Code Online (Sandbox Code Playgroud)

注意:我不想返回匿名类型.

谢谢.

Mor*_*avi 9

这样做的一种方法是:

var parent = from p in db.tblParents where p.PrimaryKey == 1
             select new {
                 Parent = p,
                 Children = p.tblChildren.Where(c => c.IsActive == true)
             }.ToList();
Run Code Online (Sandbox Code Playgroud)


但是,您可能不喜欢返回匿名类型的想法,然后我建议以这种方式编写代码:

var parent = (from p in db.tblParents where p.PrimaryKey == 1).Single();
var childrens = ctx.Contacts.Where(c => c.ParentID == 1 && c.IsActive == true);
foreach (var child in childrens) {
   parent.tblChildren.Add(child);
}
Run Code Online (Sandbox Code Playgroud)

  • 我担心没有办法用include包含"有条件的急切加载".Include()方法的API并没有这样设计.解决方法是利用**"Filtered Projection"**或通过实现**"两个跟踪查询"**来完成它,我的代码片段分别涵盖了这两种方法.如果我们可以编写类似这样的东西会很好:Include("tblChildren",c => c.IsActive == true). (3认同)