マイクロソフトグラフSDKを使用して、ピープルルックアップフィールドでSharePointリスト項目を作成します



出発点
コストを管理するために、以下の列を持つ簡単なSharePointリストを持っていると仮定します.
列名
カラムタイプ
タイトル
テキストの1行

通貨
従業員
人物
今、我々は我々のCけんかアプリケーションから経費リストの項目を作成したいと思います.ありがたいことに、マイクロソフトグラフはendpointを実行します.
POST https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-id}/items
それで、我々はいくつかのSharePoint APIとマイクロソフトのグラフSDKを活用して回避する必要はありません.

問題
経費リスト項目のJSON表現を見てみましょう.
{
  "id": "2",
  "fields": {
    "Title": "Flight to Zurich",
    "Amount": 125.6,
    "EmployeeLookupId": 13
    }
}
従業員フィールドは、ユーザープリンシパル名でもアズール広告オブジェクトでもありません.代わりに、SharePointは、サイトからサイトとは異なるユーザー参照を格納するために、隠しルックアップリストを使用します.
では、ユーザの実際のルックアップIDをどうやって得るのですか?

解決策
マイクロソフトグラフとの方法があります.少し奇妙な、正直であるが、少なくとも我々はSharePoint APIを使用する必要はありませんし、我々のグラフのバブルの中にとどまる.
まず、隠しユーザのルックアップリストのIDを取得しなければなりません.
var hiddenUserListId = (await _graph
    .Sites["<siteid>"]
    .Lists
    .Request()
    .Filter("displayName eq 'User Information List'")
    .GetAsync())[0].Id;
次に、まだ持っていない場合は、ユーザのプリンシパル名を取得しなければなりません.
var userName = (await _graph
    .Users[userId]
    .Request()
    .Select("userPrincipalName")
    .GetAsync()).UserPrincipalName;
ユーザのプリンシパル名を手にすると、ルックアップIDを問い合わせることができます.
var userLookupId = (await _graph
    .Sites["<siteid>"]
    .Lists[hiddenUserListId]
    .Items
    .Request()
    .Header("Prefer", "HonorNonIndexedQueriesWarningMayFailRandomly")
    .Filter($"fields/UserName eq '{userName}'")
    .GetAsync())[0].Id;
preferHonorNonIndexedQueriesWarningMayFailRandomlyヘッダは、インデックスなしの列を問い合わせるのに必要です.
そして最後に、新しい経費リスト項目を作成できます.
var expenseItem = new ListItem
{
    Fields = new FieldValueSet
    {
        AdditionalData = new Dictionary<string, object>
        {
            {"Title", "Train to Zurich"},
            {"Amount", 23.2},
            {"EmployeeLookupId", userLookupId}
        }
    }
};

await _graph
    .Sites["<siteid>"]
    .Lists["Expenses"]
    .Items
    .Request()
    .AddAsync(expenseItem);
別のオプションがある場合は、人々の列またはユーザーの参照を保存するには、よりクリーンな方法は、ルックアップIDを取得するには、コメントを知っている!