2008-09-18 10 views
62

मैंने अभी देखा है कि परिणामों की वापसी सूची 1000 तक सीमित है। मेरे डोमेन (विशाल डोमेन) में 1000 से अधिक समूह हैं। मैं 1000 से अधिक रिकॉर्ड कैसे प्राप्त कर सकता हूं? क्या मैं बाद के रिकॉर्ड में शुरू कर सकता हूं? क्या मैं इसे कई खोजों में काट सकता हूं?क्या मुझे ASP.NET में निर्देशिका खोजकर्ता से 1000 से अधिक रिकॉर्ड मिल सकते हैं?

यहाँ मेरी क्वेरी है:

DirectoryEntry dirEnt = new DirectoryEntry("LDAP://dhuba1kwtn004"); 
string[] loadProps = new string[] { "cn", "samaccountname", "name", "distinguishedname" }; 
DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps); 
var results = srch.FindAll(); 

मैं srch.SizeLimit = 2000 स्थापित करने के लिए कोशिश की है;, लेकिन यह काम नहीं लगता है। कोई विचार?

उत्तर

152

आपको सभी परिणामों को प्राप्त करने के लिए DirectorySearcher.PageSize को गैर-शून्य मान पर सेट करने की आवश्यकता है।

BTW आप भी DirectorySearcher जब आप API दस्तावेज़ बहुत स्पष्ट नहीं है, यह

using(DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps)) 
{ 
    srch.PageSize = 1000; 
    var results = srch.FindAll(); 
} 

को पूर्ण कर लें निपटाने चाहिए, लेकिन अनिवार्य रूप से:

  • जब आप एक पृष्ठांकित खोज करते हैं, SizeLimit को अनदेखा किया जाता है, और सभी मिलान परिणाम लौटाए जाते हैं क्योंकि आप FindAll द्वारा दिए गए परिणामों के माध्यम से पुन: प्रयास करते हैं। परिणामों को एक समय में सर्वर से पुनर्प्राप्त किया जाएगा। मैंने उपर्युक्त 1000 का मूल्य चुना है, लेकिन यदि आप पसंद करते हैं तो आप एक छोटे से मूल्य का उपयोग कर सकते हैं। ट्रेडऑफ है: एक छोटे पेजसाइज का उपयोग करके परिणामों के प्रत्येक पृष्ठ को तेज़ी से वापस कर दिया जाएगा, लेकिन बड़ी संख्या में परिणामों को फिर से चालू करते समय सर्वर पर अधिक बार कॉल की आवश्यकता होगी।

  • डिफ़ॉल्ट रूप से खोज पेज (पेजसाइज = 0) नहीं है। इस मामले में SizeLimit परिणामों तक वापस आ गया है।

Biri के रूप में बताया, यह SearchResultCollection FindAll द्वारा दिया निपटान के लिए महत्वपूर्ण है, अन्यथा आप एक स्मृति रिसाव DirectorySearcher.FindAll के लिए MSDN दस्तावेज की टिप्पणियां खंड में वर्णित के रूप में हो सकता है: http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.findall.aspx

एक .NET 2.0 या बाद में इसे टालने में मदद करने के लिए एक रैपर विधि लिखना है जो स्वचालित रूप से SearchResultCollection को निपटाता है। यह निम्नलिखित की तरह कुछ लग सकता है (या .NET 3.5 में एक विस्तार विधि हो सकता है):

public IEnumerable<SearchResult> SafeFindAll(DirectorySearcher searcher) 
{ 
    using(SearchResultCollection results = searcher.FindAll()) 
    { 
     foreach (SearchResult result in results) 
     { 
      yield return result;   
     } 
    } // SearchResultCollection will be disposed here 
} 

फिर आप इस इस्तेमाल कर सकते हैं इस प्रकार है:

using(DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps)) 
{ 
    srch.PageSize = 1000; 
    var results = SafeFindAll(srch); 
} 
+4

उत्कृष्ट वैकल्पिक हल। एक उत्थान के लायक है। – Biri

+1

इसने मेरे प्रश्न और उत्तर दिया! बहुत बढ़िया सलाह, बहुत बहुत धन्यवाद! – naspinski

+3

क्या होगा यदि foreach में प्रारंभिक समाप्ति है? क्या परिणाम संग्रह अभी भी जारी किया गया है? – kerem

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