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 データベース (おそらく MSP_EPMProject_UserView ビュー) で SQL クエリを使用します。このビューには、ほとんどの種類のカスタム フィールドの列が含まれています。

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

本当に PSI を介してこれを呼び出す必要がある場合は、iirc を使用して、必要なプロジェクトだけを取得するために発行できるフィルター処理されたクエリがありますが、目の前に構文がありません。本当にこれに SQL メソッドの代わりに PSI を使いたいかどうか教えてください。

これが役に立てば幸いです... ジェームズ・フレイザー

于 2011-02-15T20:55:50.853 に答える
0

プロジェクト全体をロードせずにカスタム フィールドをロードするには、この ReadProjectEntities(..., 32, ...) のように ReadProjectEntities を使用できます。ここで、32 は CustomField エンティティを識別します。

于 2011-08-30T09:28:51.730 に答える
0

2007 年版の PSI を使用して、これと同じ問題に遭遇しました。すべてのカスタム メタデータ プロパティを SharePoint リストに同期することにしました。これにより、クエリと消費が非常に簡単になります。ただし、同期を維持するにはかなりの作業が必要です。

別の方法として、Reporting データベースにクエリを実行することも考えられますが、これに関する適切な情報源を見つけることができませんでした。

于 2011-02-12T23:25:50.377 に答える