Подтвердить что ты не робот

Реализация шаблона хранилища с моделью данных в древовидной структуре

У меня есть два набора данных в двух разных моделях, реализующих интерфейс репозитория. Один из них находится в плоском списке, который отлично подходит для модели репозитория. Другая модель данных отформатирована в древовидной структуре, а реализация интерфейса репозитория, который я построил, выглядит очень теневой. Я мог бы попытаться сгладить вторую модель данных и просто использовать ссылки на родителей, но в настоящее время приложение имеет некоторые большие преимущества от возможности получить данные в виде древовидной структуры.

Что я хотел бы знать, есть ли у кого-нибудь опыт внедрения шаблона репозитория с помощью модели данных с использованием дерева. В настоящее время в моем методе Get(Func<T, bool> predicate) я выравниваю список с помощью рекурсивного метода и возвращаю объект с запросом LINQ, но я чувствую, что эта реализация немного дорогостоящая.

Любые советы о том, как реализовать это, будут оценены.

Здесь реализуется метод get по предикату, если это помогает проиллюстрировать силлины реализации.

protected virtual IEnumerable<T> Get(Func<T, bool> predicate)
{
    var objects = GetAll<T>();
    return objects.Where(predicate);
}

EDIT: еще один код

private IEnumerable<TreeData> GetRecursiveObjects(TreeData object)
    {
        var allChildren = new List<TreeData>();
        allChildren.AddRange(object.Children);

        foreach (var child in object.Children)
        {
            allChildren.AddRange(GetRecursiveObjects(child).ToArray());
        }
        return allChildren;
    }

    protected virtual IEnumerable<T> GetAll<T>()
    {
        var objects = new List<T>();
        objects.AddRange(Objects);
        foreach (var object in Objects)
        {
            objects.AddRange(GetRecursiveObjects(object));
        }
        return objects.OfType<T>();
    }

Второе редактирование:

Я также немного смущен тем, что хорошая стратегия для добавления элементов в репозиторий будет. Должен ли я обрабатывать добавление к дочерним элементам родительского элемента в используемом коде или должен ли репозиторий взять оба элемента и ссылаться на него родительским и обрабатывать всю операцию добавления?

ТЛ; дг

Не сумасшествие пытается реализовать интерфейс репозитория с данными в древовидной структуре?

4b9b3361

Ответ 1

Вы можете написать метод, который обрабатывает дерево и возвращает IEnumerable<T> с использованием блока итератора (yield return).

Тогда вам не нужно было бы создавать "плоскую" коллекцию содержимого вашего дерева, и вы могли бы просто использовать LINQ to Objects для применения вашего предиката:

protected virtual IEnumerable<T> Get(Func<T, bool> predicate)
{
  return WalkAll().Where( predicate );
}

Фактически, запрос LINQ даже не будет оцениваться до тех пор, пока код клиента не перечислит его.