c# - 如何选择父级和筛选的子级列表(如果存在)(外连接)

标签 c# entity-framework linq lambda extension-methods

我似乎无法弄清楚我认为应该是一件容易的任务。我发现的所有帖子似乎都只返回 child ,或者对空值没有帮助。我有以下类(class)

 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,并且想要返回特定的父级和当前子级如果它存在。所以对我来说这就像左外连接。我想使用方法扩展,因为我想了解它们如何更好地工作。

这是我尝试过的一些伪代码。即使他们没有当前的 child ,我似乎也无法让它返回 parent 。

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

我希望它返回一个 Parent 对象,并且它的 Children 集合仅填充当前子对象(如果有)。

最佳答案

当您使用 EF 导航属性(正如您所做的那样)时,无需考虑连接 - EF 会为您完成这些操作。如果您不设置特殊条件,一对多(例如父级 -> 子级)无论如何都将通过左外连接进行连接。

因此,您所需要做的就是专注于期望的结果。例如,如果您想返回特定的父级及其当前的子级,您可以使用如下内容:

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

如果您确实只需要一个当前子级(如果存在),则如下所示:

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

关于c# - 如何选择父级和筛选的子级列表(如果存在)(外连接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36653445/

相关文章:

c# - WPF 绑定(bind)更新

c# - LINQ to Entities 无法识别方法 'System.Linq.IQueryable`

entity-framework - 如何向 ADO.NET Entity Framework 中的实体添加项目

c# - 从另一个列表中删除一个对象列表

c# - LINQ 到实体 : How to return the latest order number for a customer

c# - 通用集合复制方法

c# - 在 .config 中存储供 SecureString 使用的凭据

c# - Unity3d显示状态栏

c# - MVC ViewModels 和 Entity Framework 查询

c# - 在不同存储库中共享类似的 linq to 实体表达逻辑的建议做法是什么