1

C# と CSOM を使用して、PublishedTask の Parent.Id を取得する必要があります。誰も方法を知っていますか?

(SharePoint 上で動作するクライアント側オブジェクト モデル、Project Server Online。)

次のコードは機能しません。

ProjContext.Load(PublishedProject.Tasks);
ProjContext.ExecuteQuery();

foreach (PublishedTask Task in PublishedProject.Tasks)
{    
    Console.WriteLine(Task.Parent.Id);
}

次のように Load() メソッドを変更しても機能しません。

ProjContext.Load(PublishedProject.Tasks, t => t.Include(pt => pt.Parent))
ProjContext.Load(PublishedProject.Tasks, t => t.Include(pt => pt.Id, pt => pt.Parent))
ProjContext.Load(PublishedProject.Tasks, t => t.Include(pt => pt.Id, pt => pt.Parent, pt => pt.Parent.Id))

これらすべての場合において、PublishedTask.Parent は定義されていません。PublishedTask.Parent.Id も未定義です。これらのシナリオのいずれかでこれらのプロパティにアクセスしようとすると、エラーがスローされます。

PublishedTask.Parent.Id を取得する方法を知っている人はいますか?

4

1 に答える 1

1

解決策は、Task.Parent.Id がいつ null で、いつ値を持つかを知ることです。以下のコードはそれを示しています。

public static bool IsNull(ClientObject clientObject)
{
    //check object
    if (clientObject == null)
    {
        //client object is null, so yes, we're null (we can't even check the server object null property)
        return true;
    }
    else if (!clientObject.ServerObjectIsNull.HasValue)
    {
        //server object null property is itself null, so no, we're not null
        return false;
    }
    else
    {
        //server object null check has a value, so that determines if we're null
        return clientObject.ServerObjectIsNull.Value;
    }
}

ここでこの関数を見つけました: http://chrisdomino.com/Blog/Post/An-Investigation-Into-Nullability-In-The-SharePoint-Client-Object-Model

したがって、以下のコードは上記の関数で機能します。

                ProjContext.Load(PublishedProject.Tasks);
                ProjContext.Load(PublishedProject.Tasks, t => t.Include(pt => pt.Id, pt => pt.Parent));
                ProjContext.ExecuteQuery();

                foreach (PublishedTask Task in PublishedProject.Tasks)
                {
                    string sParentId = null;
                    string sParentName = null;
                    if (!IsNull(Task.Parent))
                    {
                        sParentId = Task.Parent.Id.ToString();
                        sParentName = Task.Parent.Name;
                        string sMyName = Task.Name;
                    }
                    Console.WriteLine("{0}, {1}, {2}, {3}", Task.Name, sParentId, sParentName, Task.Work);
                }
于 2015-10-12T17:14:29.043 に答える