هل يمكنني الحصول على أكثر من 1000 السجلات من DirectorySearcher?

StackOverflow https://stackoverflow.com/questions/90652

  •  01-07-2019
  •  | 
  •  

سؤال

لقد لاحظت فقط أن عودة قائمة نتائج محدودة إلى 1000.لدي أكثر من 1000 مجموعات في المجال (ضخمة المجال).كيف يمكنني الحصول على أكثر من 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 ؛ , ولكن هذا لا يبدو أن العمل.أي أفكار ؟

هل كانت مفيدة؟

المحلول

تحتاج إلى تعيين DirectorySearcher.PageSize إلى قيمة غير صفرية للحصول على كل النتائج.

BTW يجب عليك أيضا التخلص DirectorySearcher عند الانتهاء من ذلك

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

وثائق API ليست واضحة جدا ، ولكن أساسا:

  • عندما كنت تفعل في صفحات البحث ، SizeLimit هو تجاهل جميع مطابقة النتائج عاد كما يمكنك من خلال تكرار النتائج التي تم إرجاعها بواسطة FindAll.النتائج سوف يتم استردادها من ملقم صفحة في وقت واحد.اخترت قيمة 1000 أعلاه, ولكن يمكنك استخدام قيمة أصغر إذا كان يفضل.المقايضة هي:باستخدام صغيرة PageSize سيعود كل صفحة من نتائج أسرع ، ولكن سوف تتطلب المزيد من النداءات المتكررة إلى الملقم عند بالتكرار على عدد كبير من النتائج.

  • بشكل افتراضي البحث ليس مقسم إلى صفحات (PageSize = 0).في هذه الحالة يصل إلى SizeLimit النتائج التي يتم إرجاعها.

كما Biri أشار إلى أنه من المهم أن تتخلص من SearchResultCollection عاد قبل FindAll ، وإلا قد يكون لديك تسرب الذاكرة كما هو موضح في المقطع ملاحظات وثائق MSDN DirectorySearcher.FindAll.

طريقة واحدة للمساعدة في تجنب هذا .الصافي 2.0 أو في وقت لاحق لكتابة المجمع الطريقة التي يتصرف تلقائيا على SearchResultCollection.هذا قد تبدو شيئا مثل التالية (أو يمكن أن يكون طريقة التمديد في .NET framework 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(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
    srch.PageSize = 1000;
    var results = SafeFindAll(srch);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top