12

我在实现存储库接口的两个不同模型中有两个数据集合。其中之一是在一个非常适合存储库模型的平面列表中。另一个数据模型采用树形结构格式化,我构建的存储库接口的实现看起来很阴暗。我可以尝试展平第二个数据模型并仅使用对父级的引用,但目前该应用程序从能够以树结构获取数据中获得了一些巨大的好处。

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

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

这里是 get by predicate 方法的实现,如果这有助于说明实现的愚蠢之处。

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

编辑:更多代码

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>();
    }

第二次编辑:

对于将元素添加到存储库的好策略是什么,我也有点困惑。我应该在使用代码中处理添加到父元素的子元素,还是存储库应该同时获取元素和对其父元素的引用并处理整个添加操作?

tl;博士

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

4

1 回答 1

4

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

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

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

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

于 2012-12-19T16:26:45.977 回答