[英]Can I get more than 1000 records from a DirectorySearcher?
[英]Get 2000 of 6000 records from DirectorySearcher
我有一個代碼,使用DirectorySearcher
獲得1000或所有結果。
但是我想要獲得6000個結果中的2000個。
這是獲得6000結果的代碼,而我只想要2000
mySearcher.SizeLimit = 2000;
mySearcher.PageSize = 1000;
SearchResultCollection results = mySearcher.FindAll();
int totalUsers = results.Count;
請幫忙。
謝謝
我的研究表明,PageSize = 0僅提供1000個結果,Pagesize = 1000給出所有結果。
需要更多幫助才能完成這項工作。
使用PageSize
屬性似乎有一些奇怪的行為 。
請將其設置為0
,這有用嗎?
根據這篇文章: DirectorySearcher.FindAll() - 應該有PageSize = 1000
在這種情況下 , SizeLimit
無關緊要,因為正在使用服務器端默認值,默認為1000個結果。 我從來不需要這樣的頁面,但我想使用了最小大小限制(在您的大小限制和服務器大小限制之間 - 只在我自己的AD中測試它)。 你的PageSize
確實是分頁,但是它在后台進行分頁,只返回最后一個流,因為我理解這就是你得到所有結果的原因。
我相信你最簡單的解決辦法就是在這個問題上使用Linq,並在結果上做一個.Take(2000)
。 這將以您在服務器上的額外帶寬和處理成本為您獲得所需的結果。
如果你真的想要對它進行排序,我想你必須更新服務器默認的分頁大小更高(盡管我懷疑這是出於管理原因這是可行的)。
編輯:
下面是我大致如何粗略地對待這個問題(來自我的LinqPad的快速工作示例代碼 - 還注意到我實際上帶來的一切都不像你想要通過取出等式的for循環來做到這一點):
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個結果。 由於我們並行查詢,因此較高的數字不應線性擴展。 此外,您可能希望在某種程度上包含並行化,因為這將無情地錘擊AD :)
在我的正常操作中,我使用AD對象的WhenChanged
屬性進行緩存,以將我的實際查詢減少到僅更改的對象,而不是一遍又一遍地加載相同的東西,這只是第一次觸及,后續結果只有幾分之一秒。 采用這種方法,您可以完全取消分頁,只需在啟動時加載屬性,然后只選擇已更改的條目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.