2017-03-17 5 views
0

私は、C#/ AccountManagementを使用してActive Directoryにデータを照会する、自分の組織のWebベースの従業員の電話帳を開発しています。私はADを照会し、返されたユーザープリンシパルに基づいて '従業員'のリストを作成しようとしています。すべてのレコードを取得できますが、パフォーマンス上の理由からページングされた結果をサーバーから戻すことができるようにしたいと考えています。私はFindAll()メソッドでLINQ(TakeとSkip)を利用しようとしましたが、私が実行している問題は空のGivenNameとSurnameをチェックしてテスト結果を取り除くことです。私が.Take(20)にしようとすると、例16の結果が出ます。これは、アプリでADを使用する私の最初の試みであり、誰かが正しい方向に私を向けることを望んでいる、助言や批判を愛するだろう。以下はデータアクセス方法です:Active Directoryのクエリ結果をページングするにはどうすればよいですか?

public static List<Employee> GetAllEmployees() 
    { 
     List<Employee> employees = new List<Employee>(); 
     try 
     { 

      PrincipalContext context = new PrincipalContext(ContextType.Domain, "My Domain"); 

      GroupPrincipal gp = GroupPrincipal.FindByIdentity(context, "Domain Users"); 

      UserPrincipal principal = new UserPrincipal(context); 

      principal.Enabled = true; 
      using (PrincipalSearcher searcher = new PrincipalSearcher(principal)) 
      { 
       searcher.QueryFilter = principal; 
       var results = searcher.FindAll(); 

       foreach (UserPrincipal p in results) 
       { 
        if (p.IsMemberOf(gp)) 
        { 
         if (p.GivenName != null && p.Surname != null) 
         { 
          string division = string.Empty; 
          DirectoryEntry de = p.GetUnderlyingObject() as DirectoryEntry; 
          if (de.Properties.Contains("department")) 
          { 
           division = de.Properties["department"].Value.ToString(); 
          } 

          var employee = new Employee(p.GivenName, p.Surname, p.DisplayName, p.EmailAddress, division); 

          employees.Add(employee); 
         }; 
        } 
       } 

      } 

     } 
     catch (Exception) 
     { 

      throw; 
     } 
     return employees; 
    } 
+0

ここであなたの問題は何ですか? 16を返すのはどうしたの? –

+0

http://stackoverflow.com/a/26954880/5621827あなたを助けてくれる – jitender

+0

@HungCao 1000人のユーザーがいるとしましょう。私は10、20、50、100を一度に返すことができます。結果。 FindAll()メソッドで(20)を実行すると、FirstNameまたはLastNameのないユーザーの結果がさらにフィルタされ、20の代わりに16が返されます。これは正しくないが、どうすればよいかわかりませんこれらの結果を効率的にフィルタリングしてから、次に20、10、50を返します。 – sthurston

答えて

0

私は見落とされた単純なものでした。私はforeachループの外でフィルタリングを移動しました。私は処分した:

if (p.IsMemberOf(gp)) 

if (p.GivenName != null && p.Surname != null) 

に置き換え:私のループの前に

principal.GivenName = "*"; 
principal.IsMemberOf(gp); 

。私はsearcher.Findall()メソッドで.Take()を実行し、私が期待していた速い結果を受け取ることができました。

関連する問題