如何 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();
我似乎无法弄清楚我认为应该是一件容易的事。我发现的所有帖子似乎都 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();