我是否应该创建自己的对象模型来处理Sharepoint对象的复杂性?

我是否应该创建自己的对象模型来处理Sharepoint对象的复杂性?,sharepoint,Sharepoint,我正在尝试做一些相当简单的事情,但使用SharePoint API似乎是一项几乎不可能完成的任务 我的SharePoint数据结构如下所示: -文件夹 ---子文件夹 --------项目A --------B项 --------项目C --------D项 由于某些奇怪的原因,您无法以您期望的分层方式访问文件夹和子文件夹!当我迭代列表时,它将返回忽略层次结构的所有项目(即,它将返回列表中的所有内容)。更糟糕的是,为了管理代码中的结构,您不知道该项是否为文件夹 现在,我正在编写自定义对象,以使S

我正在尝试做一些相当简单的事情,但使用SharePoint API似乎是一项几乎不可能完成的任务

我的SharePoint数据结构如下所示:

-文件夹
---子文件夹
--------项目A
--------B项
--------项目C
--------D项

由于某些奇怪的原因,您无法以您期望的分层方式访问文件夹和子文件夹!当我迭代列表时,它将返回忽略层次结构的所有项目(即,它将返回列表中的所有内容)。更糟糕的是,为了管理代码中的结构,您不知道该项是否为文件夹

现在,我正在编写自定义对象,以使SharePoint对象模型更有意义,并按照我期望的层次结构对数据进行分组。我计划将我的SharePoint项目映射如下:

public class Folder
{
    public Folder Parent {get; set;}
    public Folder Root {get; set;}
    public IList<Item> Items {get; set;}
}

不需要,只需使用该类从单个文件夹获取项目即可。这说明了如何操作。

我所做的是检查一个项的父项是否是我当前正在遍历的列表,并从那里开始工作。
SPQuery
类也可能是一个好方法。祝你好运

出于您的特定目的,从列表中获取SPList.RootFolder并从那里开始工作,递归遍历每个文件夹中的子文件夹和项目有什么问题(*)


(*)忽略此处的性能方面…

不,您确实不应该创建自己的对象来混淆SharePoint对象模型。从本质上讲,SharePoint OM反映了对象的存储方式。也就是说,列表放在单个数据库表中,而不是像文件系统那样放在文件夹中

前进的最佳方式(基于相当痛苦的经历)是磨牙,按照SharePoint的方式做事

在这种情况下,不能像在文件系统中那样使用文件夹。使用元数据“标记”列表项/文件并使用分组视图向用户显示比使用文件夹结构更容易

通常,文件夹结构(磁盘上)用作元数据的替代项(例如,通过将文件放入BusinessGroups/Marketing文件夹,而不是使用BusinessGroup的“Marketing”值对其进行标记,为其提供隐式元数据)


SharePoint太大、太笨拙,无法按照您提出的方式“战斗”。遵循流程。

要添加到Lars的答案(这是正确的答案),如果您觉得需要更改对象模型,请尝试使用扩展方法解决您的问题。我一直在这样做,取得了一些成功,

谢谢你的提示。我最终选择了这个根,因为它正是我想要的。我编辑了我的帖子以显示我使用的示例代码。非常感谢
    var query = from SPList list in Utils.GetList(webRelativeUrl, listName)
                from SPFolder folder in list.RootFolder.SubFolders
                where folder.Name.ToLower() != "forms"
                select new Folder  //Custom Object
                {
                    Name = folder.Name,
                    Children = (from SPFolder subFolder in folder.SubFolders //Further looping of sub folders                                       
                                select new Folder
                                {
                                     Name = subFolder.Name,
                                     Items = (from SPFile file in subFolder.Files
                                              select new Item
                                               {
                                               //Mapping code omitted
                                               }                                             ).ToList()
                                } 
                                        {)
                }

    return query.ToList();