1

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

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

可以想象,遍历所有项目并加载每个项目以检查自定义字段值是非常缓慢和丑陋的。我需要尽快通过自定义字段值识别 PROJ_UID,因此:

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

4

3 回答 3

1

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

SELECT
  ProjectUid
  ,ProjectName
FROM
  MSP_EPMProject_UserView mepuv
WHERE
  mepuv.[My Custom Field] = 'the value I care about'

如果你真的需要通过 PSI 调用它,然后是 iirc,你可以发出一个过滤查询来获取你需要的项目,但我面前没有语法。如果您真的想为此使用 PSI 而不是 SQL 方法,请告诉我,我会四处寻找。

希望这会有所帮助......詹姆斯弗雷泽

于 2011-02-15T20:55:50.853 回答
0

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

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

于 2011-02-12T23:25:50.377 回答
0

要加载自定义字段而不加载整个项目,您可以使用 ReadProjectEntities 这样的 ReadProjectEntities(..., 32, ...) 其中 32 标识 CustomField 实体

于 2011-08-30T09:28:51.730 回答