2012-06-01 44 views
1

我有一個代碼,可以獲取1000或使用DirectorySearcher的所有結果。從DirectorySearcher獲取2000條記錄中的2000條

但我只想得到6000個結果中的2000個。

這裏是代碼即可獲得6000名成績,而我只想要2000

mySearcher.SizeLimit = 2000; 
mySearcher.PageSize = 1000; 

SearchResultCollection results = mySearcher.FindAll(); 

int totalUsers = results.Count; 

請幫助。

感謝

我的研究說,每頁= 0只有1000個結果給出了和每頁= 1000給出的所有結果。

需要更多幫助才能完成此項工作。

+1

除0以外的任何頁面大小都會爲您提供所有結果。它只是告訴服務器有多大的結果集合返回到底層框架。 – Maverik

+0

大聲笑..所以總之沒有解決我的問題了嗎? – user175084

+0

更新了我的答案,我想簡答題是一個不。不是我們想要去做的方式。 – Maverik

回答

2

似乎有一個slight怪異behaviorPageSize屬性。
請將它設置爲0,這是否工作?

順便說一句:
c# Active Directory Services findAll() returns only 1000 entries

Can I get more than 1000 records from a DirectorySearcher in Asp.Net?

+0

如果我將它設置爲0,它會給我1000個結果。 – user175084

+0

+1我打賭喬卡普蘭的回答是正確的 - 按照慣例:-)良好的聯繫。 –

+0

這是因爲對於0,默認值是1000 .. – user175084

2

根據這個帖子:DirectorySearcher.FindAll() - should have PageSize=1000

SizeLimit不會在這種情況下重要如正在使用服務器端默認缺省到1000個結果。我從來沒有需要這樣的頁面,但我想使用最小大小限制(在您的大小限制和服務器大小限制之間 - 只是在我自己的AD中進行測試)。你的PageSize確實是分頁,但是它在後臺執行分頁,並且只返回最後一個流,因爲我知道這就是你得到所有結果的原因。

我相信你最簡單的解決方案就是在其上使用Linq並對結果執行.Take(2000)。這將以服務器上的額外帶寬和處理爲代價,爲您帶來理想的結果。

如果你真的想排序,我想你將不得不更新服務器的默認分頁大小更高(雖然我懷疑這是可行的,爲管理的原因)。

編輯:

這裏是我會去從我LinqPad這大概(快速工作示例代碼 - 也注意到,實際上,我通過採取對帶來了一切不像你可能想怎麼做環出方程式):

using(DirectoryEntry de = new DirectoryEntry("LDAP://domain.local/dc=domain,dc=local", "user", "password")) 
using(DirectorySearcher ds = new DirectorySearcher(de)) 
{ 
    ds.Filter="(&(objectCategory=user)(objectClass=user))"; 
    ds.PageSize= 1000; 
    ds.PropertiesToLoad.Clear(); 
    ds.PropertiesToLoad.Add("objectGuid"); 

    var results = ds.FindAll(); 
    var searchResults = results.Cast<System.DirectoryServices.SearchResult>().ToArray(); 
    int myDesiredPageSize = 2000; 

    var upns = new StringCollection(); 

    for(var step=0; step < Math.Ceiling((double)results.Count/myDesiredPageSize); step++) 
    { 
     Parallel.ForEach(searchResults.Skip(step*myDesiredPageSize).Take(myDesiredPageSize), result => { 
     using(var entry = result.GetDirectoryEntry()) 
     { 
      entry.RefreshCache(new[]{ "userPrincipalName" }); 

      if(entry.Properties.Contains("userPrincipalName")) 
       upns.Add(entry.Properties["userPrincipalName"][0] as string); 
     } 
     }); 
    } 

    upns.Count.Dump(); 
} 

這將返回在3秒鐘內約1400業績較在我的測試場景中我的LAN連接。由於我們並行查詢更高的數字不應該線性縮放。此外,你可能想包含一定程度的平行化,因爲這將無情地錘擊廣告:)

在我正常的操作中,我使用AD對象的WhenChanged屬性的緩存來減少我的實際查詢,而不是加載一次又一次的同樣的事情,只有第一次被擊中和後續的結果是秒的幾分之一。採用這種方法,您可以完全避免分頁,只需在啓動時加載屬性,然後只需將已更改的條目拖出(如果這是一個選項)。

+1

對我的調查結果來說,SizeLimit確實很重要,只要它低於服務器默認值。高於服務器默認值,比服務器默認值高。 –

+0

我這樣做的原因是爲了減少獲得所有結果所需的額外帶寬。而6000僅僅是一個例子。如果有100000個條目,並且用戶只想看到2000條,那麼如果獲得2000條會更快。 – user175084

+0

好吧,如果我必須在我的環境中執行此操作,我可以下拉直接指向LDAP協議,我相信您可以告訴服務器需要的結果大小(如您在ldp.exe中看到的那樣)或者我將全部只有objectGuid結果,然後使用我的分頁號並行查詢它們以獲取完整屬性。 – Maverik

相關問題