2013-05-08 4 views
6

मैं उप फ़ोल्डर्स वाले दस्तावेज़ लाइब्रेरी से सभी सूची आइटम पुनर्प्राप्त करने के लिए क्लाइंट साइड ऑब्जेक्ट मॉडल दृष्टिकोण सी # का उपयोग कर रहा हूं। मैंने एमएसडीएन दस्तावेज की जांच की और मैं अटक गया हूं कि मुझे फील्ड संपत्ति क्यों नहीं मिल सकती है, या अगर मैं यह अधिकार भी कर रहा हूं।दस्तावेज़ सब लाइब्रेरी में सभी सबफ़ोल्डर से सभी दस्तावेज़ पुनर्प्राप्त करें - सीएसओएम

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 (subFolder.Files में फ़ाइल च)" संग्रह त्रुटि आरंभ नहीं किया जा सकता है। क्या सीएसओएम का उपयोग कर दस्तावेज़ लाइब्रेरी में प्रत्येक सबफ़ोल्डर में सभी दस्तावेज़ों के फ़ील्ड मान प्राप्त करने के लिए वैसे भी है?

मुझे पता है कि आप फ़ील्ड मानों के साथ-साथ सूची आइटम यानी (सूची Item ["fieldName"]) को दृढ़ता से टाइप कर सकते हैं। क्या मुझे इसके बजाय इस मार्ग पर जाना चाहिए?

उत्तर

7

कुछ सिफारिशें:

1) पसंद करते हैं ClientRuntimeContext.LoadQuery method एक विशिष्ट सूची लोड करने के लिए, उदाहरण के लिए:

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

2) के बाद से SharePoint SCOM Request Batching का समर्थन करता है यह संख्या को कम करने की सिफारिश की है सर्वर के अनुरोध के लिए। निम्न उदाहरण दर्शाता है कि कैसे आदेश दस्तावेज़ लाइब्रेरी से सभी फाइलों को लोड करने के लिए सर्वर के लिए एक एकल अनुरोध करने के लिए:

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(); 

यह अधिक लो के रास्ते अनुकूलित है प्रदर्शन परिप्रेक्ष्य

पूरा उदाहरण से विशिष्ट सूची ading

कैसे 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); 
     } 
     }   
} 
+0

आपका दृष्टिकोण वास्तव में अच्छा लगता है, लेकिन मुझे 'आइटम्स पर समर्थित नहीं किया गया है। चयन करें (i => i.File) ' – Santhos

1
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) 
        { 
      clientcontext.Load(subFolder.Files); 
        clientcontext.ExecuteQuery(); 
         foreach (File f in subFolder.Files) 
         { 
          Console.WriteLine((string) f.Title);      
         } 
        } 
       } 
     } 
    } 
+0

आप "list.RootFolder" के लिए अतिरिक्त क्वेरी भार याद कर रहे हैं और फिर "list.RootFolder.Folders"। यदि आप उन्हें नहीं जोड़ते हैं, तो यह काम नहीं करता है (प्रारंभिक त्रुटि दें। लेकिन मुझे करीब लाने के लिए +1। :) –

संबंधित मुद्दे

 संबंधित मुद्दे