9

サブ フォルダーを含むドキュメント ライブラリからすべてのリスト アイテムを取得するために、クライアント側オブジェクト モデル アプローチ C# を使用しています。MSDN のドキュメントをチェックアウトしましたが、フィールド プロパティを取得できない理由、またはこれを正しく行っているかどうかについて行き詰まっています。

    NetworkCredential credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
            ClientContext clientcontext = new ClientContext(Resources.defaultSPSite);
            clientcontext.Credentials = credentials;

            //Load Libraries from SharePoint
            //Web site = clientcontext.Web;
            clientcontext.Load(clientcontext.Web.Lists);
            clientcontext.ExecuteQuery();


            //List sharedDocumentsList = clientcontext.Web.Lists.GetByTitle("TestLDOCS");
            //CamlQuery camlQuery = new CamlQuery();
            //camlQuery.ViewXml = @"<View Scope='Recursive'><Query></Query></View>";

            foreach (List list in clientcontext.Web.Lists)
            {
                clientcontext.Load(list);
                clientcontext.ExecuteQuery();
                //list.TemplateFeatureId.ToString().Equals("") &&
                    string baseType =  list.BaseType.ToString();
                    string listTitle = list.Title.ToString();
                    if (list.BaseType.ToString().Equals("DocumentLibrary", StringComparison.InvariantCultureIgnoreCase) && list.Title.ToString().Equals("TestLDOCS", StringComparison.InvariantCultureIgnoreCase))
                    {
                        foreach (Folder subFolder in list.RootFolder.Folders)
                        {
                            foreach (File f in subFolder.Files)
                            {
                                Console.WriteLine((string) f.Title);                     
                            }
                        }
                    }
             }
        }

私が受け取っているエラーは、「foreach(File f in subFolder.Files)」コレクションが初期化されていない可能性があるというエラーです。CSOM を使用して、ドキュメント ライブラリ内のすべてのサブフォルダー内のすべてのドキュメントのフィールド値を取得する方法はありますか?

リスト項目 (listItem["fieldName"]) を使用してフィールド値を厳密に入力できることは知っています。代わりにこのルートを使用する必要がありますか?

4

2 に答える 2

14

いくつかの推奨事項:

1) ClientRuntimeContext.LoadQuery メソッドを優先して、特定のリストをロードします。次に例を示します。

var lists = ctx.LoadQuery(ctx.Web.Lists.Where(l => l.BaseType == BaseType.DocumentLibrary));
ctx.ExecuteQuery();

2) SharePoint SCOM は要求のバッチ処理をサポートしているため、サーバーへの要求の数を最小限に抑えることをお勧めします。次の例は、ドキュメント ライブラリからすべてのファイルを読み込むために、サーバーに対して単一の要求を実行する方法を示しています。

foreach (var list in lists)
{
    var items = list.GetItems(CreateAllFilesQuery());
    ctx.Load(items, icol => icol.Include(i => i.File));
    results[list.Title] = items.Select( i=>i.File);
}
ctx.ExecuteQuery();

3) 以下に示すように、CAML クエリを介してすべてのファイルをロードすることをお勧めします。

public static CamlQuery CreateAllFilesQuery()
{
   var qry = new CamlQuery();
   qry.ViewXml ="<View Scope=\"RecursiveAll\"><Query><Where><Eq><FieldRef Name=\"FSObjType\" /><Value Type=\"Integer\">0</Value></Eq></Where></Query></View>";
   return qry;
}

次に、次の例は、ライブラリ内のすべてのファイルを返します。

var items = list.GetItems(CreateAllFilesQuery());
ctx.Load(items, icol => icol.Include(i => i.File));
ctx.ExecuteQuery();
var files = items.Select( i=>i.File).ToList();

パフォーマンスの観点から特定のリストをロードするためのより最適化された方法です

完全な例

SharePoint CSOM を使用してドキュメント ライブラリからすべてのファイルを読み込む方法:

using (var ctx = new ClientContext(webUri))
{

     var results = new Dictionary<string, IEnumerable<File>>();
     var lists = ctx.LoadQuery(ctx.Web.Lists.Where(l => l.BaseType == BaseType.DocumentLibrary));
     ctx.ExecuteQuery();
     foreach (var list in lists)
     {
         var items = list.GetItems(CreateAllFilesQuery());
         ctx.Load(items, icol => icol.Include(i => i.File));
         results[list.Title] = items.Select( i=>i.File);
     }
     ctx.ExecuteQuery();

     //Print results
     foreach (var result in results)
     {
         Console.WriteLine("List: {0}",result.Key);
         foreach (var file in result.Value)
         {
             Console.WriteLine("File: {0}", file.Name);
         }
      }        
}
于 2015-01-12T15:07:29.637 に答える