我试图通过自定义字段值找到特定项目。到目前为止,这是我发现的最佳方式:
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,因此:
有没有办法在不加载整个项目的情况下获取自定义字段值?
答案 0 :(得分: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方法,请告诉我,我会四处寻找。
希望这会有所帮助...... 詹姆斯弗雷泽
答案 1 :(得分:0)
使用2007版PSI,我们遇到了同样的问题。我们决定将所有自定义元数据属性同步到SharePoint列表。这使得查询和使用非常容易。但是,同步需要维护很多工作。
我认为另一种方法是查询报告数据库,但我无法为此找到一个很好的信息来源。
答案 2 :(得分:0)
要加载自定义字段而不加载整个项目,您可以使用ReadProjectEntities,如此ReadProjectEntities(...,32,...),其中32标识CustomField实体