Linq to Entity Framework возвращает список родителей с только подмножеством или пустой коллекцией детей - PullRequest
2 голосов
/ 14 марта 2012

Учитывая список родителей и их детей, я хочу вернуть список всех родителей и только их детей мужского пола.Это тривиально в запросе SQL.У меня проблема с Linq to EF. Я не могу заставить запрос работать каким-либо образом.Из-за ограничений EF я не могу сделать включение, чтобы гарантировать возвращение детей, которых я хочу.Как выполнить приведенный ниже sql в LINQ, чтобы вернуть мою коллекцию «Родительская сущность с детьми», в которой только мужчины или пустые коллекции игнорируют все женские записи?

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 ]

3 голосов
/ 14 марта 2012

Вы можете сделать это, если не возражаете против проецирования на анонимный тип или 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 голос
/ 14 марта 2012

попробуйте оператор 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)

...