C# 搜索结果集合的部分搜索-Active Directory,所有组

C# 搜索结果集合的部分搜索-Active Directory,所有组,c#,linq,collections,active-directory,C#,Linq,Collections,Active Directory,我有一个active directory的组名列表存储在:- SearchResultCollection AllGroupsResults; DirectorySearcher ds = null; DirectoryEntry de = new DirectoryEntry(domainPath); <--- passed ina ds = new DirectorySearcher(de); // Sort by name ds.Sort = new SortOption

我有一个active directory的组名列表存储在:-

SearchResultCollection AllGroupsResults;

 DirectorySearcher ds = null;
 DirectoryEntry de = new DirectoryEntry(domainPath); <--- passed ina
 ds = new DirectorySearcher(de);
 // Sort by name
 ds.Sort = new SortOption("name", SortDirection.Ascending);
 ds.PropertiesToLoad.Add("name");
 ds.Filter = "(&(objectCategory=Group))";
 AllGroupsResults = ds.FindAll();
但是我的语法不起作用,因为集合没有FindAll的定义。。。这是否意味着我需要将我的集合转换为自定义的列表,还是有其他我不知道的方法

**编辑**

var partialGroupNameMatch = AllGroupsResults.Cast<SearchResult>().ToList()
                           .FindAll(o => o.Properties["name"].Contains(searchString));
多亏了这些建议,我才有了正确的语法。。。但返回的Where或FindAll子句的结果为-0…即使是像a或a这样的泛型字符串

我可以在我的AllGroupsResults集合上设置一个断点,并看到它有两个属性“adspath”和“name”……它们都有超过5000个值

令我困惑的是:-

 var q2 = AllGroupsResults.Cast<SearchResult>().Select(o => o.Properties["name"]).ToList();
 var partialMatch = q2.Where(o => o.Contains(searchString));
而q2。。。其中包含所有组名的结果。。。当我对其执行partialMatch查询时,我有0个结果…无论我的查询字符串多么通用。

SearchResultCollection实现了非通用System.Collections.IEnumerable,因此您可以从此处开始在中强制转换和使用常规LINQ:

var partialGroupNameMatches = 
      AllGroupsResults
          .Cast<SearchResult>()
          .Where(er => er.GroupName.Contains(searchString));
请注意,sr.Properties[name]集合包含对象,它对LINQ不是很友好,但只要它实现System.Collections.IEnumerable——以及sun下的几乎所有功能,如果它是一个远程集合——我们就可以进行转换,我们就可以开展业务

现在我在partialGroupNameMatches中得到了预期的结果

剩下的就留给你了

FindAll方法是列表方法,而不是ICollection方法。因此,即使您的SearchResultCollection实现了ICollection,也没有任何称为FindAll的方法。有两种选择,正如我对你的问题所想

创建一个列表并在那里调用FindAll方法。 调用Where扩展方法,因为SearchResultCollection实现IEnumerable。
[我看这里:。你应该让搜索结果填充一个DirectoryEntry。然后你可以根据目录项的属性搜索它们。服务器端排序在AD中非常昂贵。如果你有一个非常大的结果集,它们也有可能失败。如果可以,你应该在客户端进行排序。我尝试了:-var partialGroupNameMatch=AllGroupsResults.Cast.ToList.FindAllo=>o.Properties[name].containssearch字符串;但是,即使使用最通用的字符串“a”,我也不会得到任何结果results@Philo您不喜欢Where的哪些方面?无论如何,看看您在这里得到了什么:var q1=AllGroupsResults.Cast.ToList;var q2=AllGroupsResults.Cast.Selecto=>o.Properties[name].ToList;-设置一个断点,并查看调试器监视窗口以查看在q2和q2中得到的结果。另外,var n=AllGroupsResults.Count;。在查询之前,AllGroupsResults中有多少个结果?我检查了所有这些Ed,AllGroupResults的计数为5943…并且有两个属性,adspath和name…所有属性都有相应的值es,因为我的gridView由them@Philo我的荣幸。我真不敢相信我花了这么长时间才记住SearchResults。属性值是垃圾的集合,而不是单个值;我以前经历过这种恐怖。看起来我必须手动将集合转换为列表……我的SearchResults上的where子句不起作用'找不到任何结果,即使使用最通用的搜索临界值,如'a'
var partialGroupNameMatches = 
      AllGroupsResults
          .Cast<SearchResult>()
          .Where(er => er.GroupName.Contains(searchString));
var partialGroupNameMatches = 
      AllGroupsResults
          .Cast<SearchResult>()
          .Where(sr => 
              //  Return true if *any* name contains searchString
              sr.Properties["name"].Cast<String>()
                .Any(s => s.Contains(searchString))
          );