Sharepoint MS Project 2010 PSI:有没有一种方法可以在不加载项目的情况下获取自定义字段值?

Sharepoint MS Project 2010 PSI:有没有一种方法可以在不加载项目的情况下获取自定义字段值?,sharepoint,project-server,psi,Sharepoint,Project Server,Psi,我试图通过自定义字段值定位特定项目。到目前为止,这是我找到的最好的方法: var targetProjectId = "some_external_reference_ID"; var projIdCustomFieldUid = GetCustomFieldUidByName("ExternalProjectId"); var projectList = base.ProjectClient.ReadProjectList(); foreach (ProjectDataSet.Project

我试图通过自定义字段值定位特定项目。到目前为止,这是我找到的最好的方法:

var targetProjectId = "some_external_reference_ID";
var projIdCustomFieldUid = GetCustomFieldUidByName("ExternalProjectId");
var projectList = base.ProjectClient.ReadProjectList();

foreach (ProjectDataSet.ProjectRow projRow in projectList.Project.Rows)
{
    var fullProj = base.ProjectClient.ReadProject(projRow.PROJ_UID, DataStoreEnum.WorkingStore);
        if (fullProj != null)
        {
            var cf = fullProj.ProjectCustomFields.Where(x => x.MD_PROP_UID == projIdCustomFieldUid && x.TEXT_VALUE == targetProjectId ).FirstOrDefault();
            if (cf != null)
            {
                return fullProj;
            }
        }
    }
    return null;
}
正如您可以想象的那样,遍历所有项目并加载每个项目以检查自定义字段值的过程非常缓慢和丑陋。我需要尽可能快地通过自定义字段值识别项目,因此:


有没有一种方法可以在不加载整个项目的情况下获取自定义字段值?

使用2007版的PSI,我们遇到了同样的问题。我们决定将所有自定义元数据属性同步到SharePoint列表。这使得查询和消费变得非常容易。然而,要保持同步需要做很多工作


我认为另一种方法是查询报告数据库,但我一直无法找到这方面的良好信息来源。

使用2007版的PSI,我们遇到了同样的问题。我们决定将所有自定义元数据属性同步到SharePoint列表。这使得查询和消费变得非常容易。然而,要保持同步需要做很多工作


我认为另一种方法是查询报表数据库,但我还没有找到一个好的信息源。

如果您只需要已发布的项目,那么我会在ProjectServer\u报表数据库上使用SQL查询,可能是MSP\u EPMProject\u用户视图。此视图包括大多数类型的自定义字段的列

SELECT
  ProjectUid
  ,ProjectName
FROM
  MSP_EPMProject_UserView mepuv
WHERE
  mepuv.[My Custom Field] = 'the value I care about'
如果你真的需要通过PSI调用它,那么iirc,你可以发出一个过滤查询来获得你需要的项目,但是我面前没有语法。如果您真的想使用PSI而不是SQL方法,请告诉我,我将四处寻找

希望这有助于。。。
James Fraser

如果您只需要发布的项目,那么我将在ProjectServer\u报告数据库上使用SQL查询,可能是MSP\u EPMProject\u用户视图。此视图包括大多数类型的自定义字段的列

SELECT
  ProjectUid
  ,ProjectName
FROM
  MSP_EPMProject_UserView mepuv
WHERE
  mepuv.[My Custom Field] = 'the value I care about'
如果你真的需要通过PSI调用它,那么iirc,你可以发出一个过滤查询来获得你需要的项目,但是我面前没有语法。如果您真的想使用PSI而不是SQL方法,请告诉我,我将四处寻找

希望这有助于。。。
James Fraser若要在不加载整个项目的情况下加载自定义字段,可以使用ReadProjectEntities(…,32,…)这样的ReadProjectEntities,其中32标识自定义字段实体

若要在不加载整个项目的情况下加载自定义字段,可以使用ReadProjectEntities这样的ReadProjectEntities(…,32,…)其中32个标识CustomField实体

Hey Kit,感谢您的回答。我不清楚什么是sharepoint列表(sharepoint和project都是新手,我学到了很多东西,甚至到目前为止)。如果你能启发我,我将不胜感激。如果它以同样的方式工作(我只使用了2007年),你的PWA网站就是一个SharePoint网站。MS Project使用SharePoint托管PWA最终用户界面。在该SharePoint PWA站点中,您可以创建普通的SharePoint对象:站点、文档库、列表、日历等。我还要补充一点,我刚才问了一个类似的问题:好的,我明白你的意思。我知道这是怎么回事。我希望能有一些更直接的自定义表,这样我们就不必显式地管理键和值。目前,为了加快速度,我已经切换到在处理会话期间预填充字典,但这也不是最好的解决方案。嘿,Kit,谢谢你的回答。我不清楚什么是sharepoint列表(sharepoint和project都是新手,我学到了很多东西,甚至到目前为止)。如果你能启发我,我将不胜感激。如果它以同样的方式工作(我只使用了2007年),你的PWA网站就是一个SharePoint网站。MS Project使用SharePoint托管PWA最终用户界面。在该SharePoint PWA站点中,您可以创建普通的SharePoint对象:站点、文档库、列表、日历等。我还要补充一点,我刚才问了一个类似的问题:好的,我明白你的意思。我知道这是怎么回事。我希望能有一些更直接的自定义表,这样我们就不必显式地管理键和值。目前,为了加快速度,我已经切换到在处理会话期间预填充字典,但这也不是最好的解决方案。问题是,即使您只有项目的GUID,也必须为每个项目发出请求。如果你有5个项目就可以了。如果您的数据大于500,并且需要web应用程序的数据,则会出现问题。问题是,即使您只有项目的GUID,也必须为每个项目发出请求。如果你有5个项目就可以了。一个问题,如果你有>500,你需要一个网络应用程序的数据。我需要做这个确切的事情,它必须通过PSI。如果您有使用过滤查询的详细信息,我将不胜感激。我的尝试没有成功。我需要做这个确切的事情,它必须通过PSI。如果您有使用过滤查询的详细信息,我将不胜感激。我的尝试没有成功。