使用树结构中的数据模型实现存储库模式

Mor*_*iya 12 c# tree repository-pattern

我在两个不同的模型中有两个数据集合,它们实现了存储库接口.其中一个是在一个与证书库模型非常吻合的平面列表中.另一个数据模型以树结构格式化,我构建的存储库接口的实现看起来非常阴暗.我可以尝试展平第二个数据模型,只使用对父项的引用,但是目前应用程序可以将数据作为树结构获得一些很大的好处.

我想知道的是,有人有任何使用树结构化数据模型实现存储库模式的经验.目前在我的Get(Func<T, bool> predicate)方法中,我使用递归方法展平列表并使用LINQ查询返回对象,但我觉得这个实现有点代价.

任何有关如何实现这一点的提示将不胜感激.

这是get by predicate方法的实现,如果这有助于说明实现的sillines.

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

编辑:一些更多的代码

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>();
    }
Run Code Online (Sandbox Code Playgroud)

第二次编辑:

关于向存储库添加元素的好策略,我也有点困惑.我应该在使用代码中处理父元素的子元素的添加,还是存储库同时使用元素和对它的父元素的引用并处理整个add操作?

TL;博士

尝试使用树结构中的数据实现存储库接口是不是很疯狂?

Nic*_*ler 4

您可以编写一个方法来遍历树并返回IEnumerable<T>使用迭代器块 ( yield return) 的方法。

然后,您不必创建树内容的“平面”集合,您只需使用 LINQ to Objects 来应用谓词:

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

事实上,在客户端代码枚举 LINQ 查询之前,它甚至不会被计算。