Linq to Entity Framework返回父类列表,其中只包含子集或空子集

时间:2012-03-14 15:59:17

标签: linq linq-to-entities entity-framework-4.1

鉴于父母及其子女的名单,我想返回所有父母和他们的男孩的名单。这在sql查询中是微不足道的。我遇到的问题是Linq到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'

2 个答案:

答案 0 :(得分:3)

如果你不介意投射到匿名类型或像这样的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  
            };

答案 1 :(得分:1)

尝试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)