如何 select parent 和 children 的过滤列表(如果存在)(外部连接)

How to select a parent and a filtered list of children if they exist (outer join)

我似乎无法弄清楚我认为应该是一件容易的事。我发现的所有帖子似乎都 returning 只是 children,或者对 null 没有帮助。我有以下 类

 public class Parent
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual List<Child> Children { get; set; }
}

public class Child
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int isCurrent { get; set; }
} 

我正在使用 EF,我想 return 一个特定的 parent 和 current child if 它存在。所以对我来说这就像一个左外连接。我想使用方法扩展,因为我想了解它们如何更好地工作。

这是我试过的一些伪代码。即使他们没有电流 child,我似乎也无法达到 return a parent。

var test  = db.Parents
                .Where(p => p.ID == 1)
                .Select( p => p.Children.Where(c => c.isCurrent == 1).DefaultIfEmpty()                            
                ); 

我希望它 return 一个 Parent object 并且 Children 到 collection 只填充当前的 child如果有的话。

当您使用 EF 导航属性(就像您所做的那样)时,无需考虑联接 - EF 会为您完成。如果您不设置特殊条件,one-to-many(例如 parent -> children)无论如何都将与左外连接连接。

所以您只需要专注于想要的结果。例如,如果你想 return 一个特定的 parent 并且它是当前的 children,你可以使用这样的东西:

var test = (from p in db.Parents
            where p.ID == 1
            select new
            { 
                Parent = p,
                CurrentChildren = p.Children.Where(c => c.isCurrect == 1)
            }).FirstOrDefault();

如果您确实只需要一个电流 child(如果存在),那么像这样:

var test = (from p in db.Parents
            where p.ID == 1
            select new
            { 
                Parent = p,
                CurrentChild = p.Children.FirstOrDefault(c => c.isCurrect == 1)
            }).FirstOrDefault();

如果你使用Explicit Loading:

也可以达到你想要的效果
 var parent=db.Parents.FirstOrDefault(p=>p.ID==1);
 context.Entry(parent) 
        .Collection(p => p.Children) 
        .Query() 
        .Where(c => c.isCurrent==1) 
        .Load();