В этом примере, как получить только Foos, которые имеют активную панель и возвращать только активные бары в коллекции?Выбор подмножества коллекции с Linq
Одним из возможных решений является чем-то вроде этого, но это требует воссоздания Foo элементы:
fooList
.Where(f => f.Bars.Any(b => b.IsActive))
.Select(f => new Foo()
{
Name = f.Name,
Bars = f.Bars.Where(b => b.IsActive).ToList()
});
public class Foo
{
public string Name { get; set; }
public ICollection<Bar> Bars { get; set; }
}
public class Bar
{
public string Name { get; set; }
public bool IsActive { get; set; }
}
Edit 1
Цель состоит в том, чтобы получить только FOOS с любым активным баром и для этих Foos, только активные бары.
FooA
Bar1 (Active)
Bar2 (Inactive)
FooB
Bar3 (Inactive)
Bar4 (Inactive)
FooC
Bar5 (Active)
Bar6 (Active)
Disired результат:
FooA
Bar1 (Active)
FooC
Bar5 (Active)
Bar6 (Active)
Как заостренный Theres много простых решений, но мне интересно, если Linq имеет какой-либо способ сделать это без извлекать все бары, а затем падение неактивного в цикле как после того, как все Бары были извлечены в память.
Ну да, вы должны создать новые объекты 'Foo' - потому что существующие объекты 'Foo' могут иметь неактивные ссылки« Bar ». Что бы вы хотели, чтобы решение действительно возвращало, если не новые объекты? Вы действительно заботитесь только о объектах «Бар»? (Если это так, это легко.) Если бы вы могли описать «форму» нужного результата, реализация должна быть простой. –
Просто интересно, есть ли какое-то конкретное решение для такого рода проблемы (всегда пытаюсь узнать что-то новое) :) –
Ну, без особого контекста, мы действительно не знаем, что вы подразумеваете под «такой проблемой». LINQ не позволяет одному объекту одновременно не иметь активных объектов «Бар» и сохраняет свою предыдущую информацию, если это то, о чем вы думали ... –