Запрос LINQ для возврата значений бабушки и дедушки, которым соответствуют внуки

#c# #linq

#c# #linq

Вопрос:

Идея состоит в том, чтобы вернуть список бабушек и дедушек, у которых есть внуки с именем ‘Bob’

 List<GrandParent> g_rents = new List<GrandParent>();

class GrandParent
{
   public string Name { get; set; }
   public List<Parent> l_rents { get; set; }

   public GrandParent()
   {
      l_rents = new List<Parent>();
   }

}

class Parent
{
   public string Name { get; set; }
   public List<Child> l_kids { get; set; }

   public Parent()
   {
       l_kids = new List<Child>();
   }

}

class Child
{
   public string Name { get; set; }

}
  

Я пробовал 2 разных запроса:

    var y = g_rents.Where( p => p.l_rents.l_kids.Any(o => o.Name == "Bob") );
  

Имеет ошибку:

 'List<Parent>' does not contain a definition for 'l_kids' and no accessible extension method     'l_kids' accepting a first argument of type 'List<Parent>'
  

Этот запрос:

    var x = g_rents.Where(g => g.l_rents.Where(h => h.l_kids.Select(i => i.Name=="Bob"));
    
  

Произошла ошибка:

 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<bool>' to 'bool' 
  

Я использую LINQ ровно настолько, чтобы знать, что, вероятно, в них не хватает чего-то простого, но я не могу понять, чего.

Спасибо!

Комментарии:

1. Вам нужно Any на l_rents также в вашей первой попытке

2. Привет, Ли. Не бойтесь использовать больше букв при описании свойств внутри классов. Например, вы можете использовать KidsList вместо l_kids . Это более читабельно и более доступно для обслуживания.

3. Спасибо CoolBots!!!

Ответ №1:

Вы почти на месте; вам также нужно Any на l_rents :

 g_rents.Where(g => g.l_rents.Any(p => p.l_kids.Any(k => k.Name == "Bob")));
  

Логика заключается в следующем: «для каждого бабушки и дедушки g в списке бабушек и дедушек g_rents верните тех Where Any родителей p , у которых в списке g родителей g.l_rents этого дедушки и бабушки есть Any ребенок k в списке детей этого соответствующего родителя p.l_kids , которого зовут «Боб» ( k.Name == "Bob" ).

Ответ №2:

CoolBots прав. Вам нужен .Any() там. Это то, что я сделал, но теперь я понимаю, что Where ‘ы не нужны. Я бы согласился с ответом CoolBots.

  var grandParents = g_rents.Where(gp => gp.l_rents
                             .Where(p => p.l_kids
                               .Where(k => k.Name.Equals("Bob")).Any())
                              .Any()).ToList();
  

Я понятия не имел, что вы могли бы добавить лямбду Any . Чем больше вы знаете…

Комментарии:

1. Смехотворно! Представьте, что принятый ответ — это тот, который говорит, что мой правильный!