如何分页我的Active Directory查询结果?

时间:2017-03-17 04:45:45

标签: c# .net linq active-directory

我正在为我的组织开发一个基于Web的员工电话簿,该目录使用C#/ AccountManagement查询Active Directory的数据。我正在尝试查询AD并根据返回的用户主体创建“员工”列表。我可以获取所有记录,但希望能够出于性能原因从服务器返回分页结果。我试图在我的FindAll()方法上使用LINQ(Take和Skip),但我遇到的问题是我进一步过滤我的结果以检查空的GivenName和Surname以摆脱测试帐户等。这最终返回例子16当我尝试时得到结果。采取(20)。这是我第一次尝试在应用程序中使用AD,并希望有人可以指出我正确的方向,会喜欢任何建议或批评。以下是数据访问方法:

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;
    }

1 个答案:

答案 0 :(得分:0)

事实证明,答案很简单,我忽略了。我将过滤移到了foreach循环之外。我摆脱了:

if (p.IsMemberOf(gp))

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

并替换为:

principal.GivenName = "*";
principal.IsMemberOf(gp);
在我的循环之前

。我现在能够在.Take()方法上执行searcher.Findall()并获得我期待的快速结果。