У меня есть следующая схема сущностей:
class Container
{
Forest Forest;
Tree Tree;
}
class Forest
{
int Id;
string Name;
List<Trees> Trees;
}
class Tree
{
int Id;
string Name;
Forest Forest;
List<Leaf> Leafs;
}
class Leaf
{
int Id;
string Name;
Tree Tree;
}
У меня есть коллекция Forest
с включенным Trees and Leafs
для чтения из базы данных.
Как я могу сделать следующее:
Отфильтруйте коллекцию Forests
на основе следующего правила: Возьмите записи Фореста, у которых либо [Name]
содержит некоторые "filter value"
Или тех, у кого Trees
[Name]
содержит "filter value"
Или тех, кто Leaf
[Name]
содержит "filter value"
.
Мне нужно вернуть иерархию леса, а не сплющенное представление леса
Я попытался сгладить структуру для фильтрации записей, например, таблицы в базе данных из INNER JOIN
view
IEnumerable<Container> containers;
var groupped = forests.Select(f => new {f.Forest, f.Tree})
.GroupBy(f => f.Forest)
.ToList().Select(fs => new {Forest = fs.Key, Leafes = fs.SelectMany(g => g.Tree.Leafes) }).ToDictionary(fx => fx.Forest, fx => fx.Leafes);
var flat = new List<Tuple<Forest, Tree, Leaf>>;
foreach (var i in groupped)
{
foreach (var l in i.Value)
{
flat.Add((i.Key, l.Tree, l));
}
}
flat.Where(d => d.Item1.Name.Contains("")
|| d.Item2.Name.Contains("")
|| d.Item3.Name.Contains(""));
Но на самом деле здесь я не могу объединить их обратно в иерархию Forest -> Tree -> Leaf
Итак, вместо какой-то табличной структуры List<Tuple<Forest,Tree,Leaf>>
Iхотите иметь нормальную коллекцию List<Forest>
с Trees
и Leafs
отфильтрованными.