Linq to Entity Framework返回一个父级列表,其中只包含子级的子集或空集合

Linq to Entity Framework返回一个父级列表,其中只包含子级的子集或空集合,linq,linq-to-entities,entity-framework-4.1,Linq,Linq To Entities,Entity Framework 4.1,给我一份父母及其子女的名单,我想返回一份所有父母的名单,只有他们的男性子女。这在sql查询中是微不足道的。我的问题是Linq to EF似乎无法以任何方式使查询工作。由于EF的限制,我不能做一个包含,以确保我想要的孩子返回。如何在LINQ中完成下面的sql,以返回只有男性的父实体和子实体集合,或忽略所有女性记录的空集合 SQL SELECT p.Id, p.FirstName, p.LastName, c.Id, c.ParentId, c.FirstName, c.LastName, c.Se

给我一份父母及其子女的名单,我想返回一份所有父母的名单,只有他们的男性子女。这在sql查询中是微不足道的。我的问题是Linq to EF似乎无法以任何方式使查询工作。由于EF的限制,我不能做一个包含,以确保我想要的孩子返回。如何在LINQ中完成下面的sql,以返回只有男性的父实体和子实体集合,或忽略所有女性记录的空集合

SQL

SELECT p.Id, p.FirstName, p.LastName, c.Id, c.ParentId, c.FirstName, c.LastName, c.Sex FROM Parent p 
LEFT JOIN children c ON c.ParentId = p.Id AND c.Sex = 'M'

请尝试Where Not In操作符

var query =
    from p in dc.Parent
    where !(from c in dc.children
        select c.ParentId where c.Sex = 'F')
       .Contains(c.ParentId)
    select c;

我不知道你的对象结构,所以你必须调整查询,但基本概念应该能让你达到你想要的位置。(我不主张语法完全正确:-p)

尝试Where Not In操作符

var query =
    from p in dc.Parent
    where !(from c in dc.children
        select c.ParentId where c.Sex = 'F')
       .Contains(c.ParentId)
    select c;

我不知道你的对象结构,所以你必须调整查询,但基本概念应该能让你达到你想要的位置。(我不主张语法完全正确:-p)

如果您不介意投影到匿名类型或POCO之类的类型,您可以实现这一点:

具有子对象集合的父对象:

var query = from p in context.Parents
            join c in context.Children.Where(x => x.Sex == 'M') on p.Id equals c.ParentId into childrenGroup
            select new
            {
              Parent = p,
              Children = childrenGroup,
            };
展开列表:

var query = from p in context.Parents
            from c in context.Children.Where(x => p.Id == x.ParentId)
                                      .Where(x => x.Sex == 'M')
                                      .DefaultIfEmpty()
            select new
            {
              ParentId = p.Id,
              ParentFirstName = p.FirstName,
              ParentLastName = p.LastName, 
              ChildId = c.Id, 
              ChildFirstName = c.FirstName, 
              ChildLastName = c.LastName, 
              ChildSex = c.Sex  
            };

如果您不介意投影到匿名类型或POCO之类的类型,则可以实现这一点:

具有子对象集合的父对象:

var query = from p in context.Parents
            join c in context.Children.Where(x => x.Sex == 'M') on p.Id equals c.ParentId into childrenGroup
            select new
            {
              Parent = p,
              Children = childrenGroup,
            };
展开列表:

var query = from p in context.Parents
            from c in context.Children.Where(x => p.Id == x.ParentId)
                                      .Where(x => x.Sex == 'M')
                                      .DefaultIfEmpty()
            select new
            {
              ParentId = p.Id,
              ParentFirstName = p.FirstName,
              ParentLastName = p.LastName, 
              ChildId = c.Id, 
              ChildFirstName = c.FirstName, 
              ChildLastName = c.LastName, 
              ChildSex = c.Sex  
            };