использование linq для активных каталогов базового объекта - PullRequest
1 голос
/ 12 марта 2019

В настоящее время мой код:

using (var context = new PrincipalContext(ContextType.Domain, adDomain))
{
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
    {
        foreach (Principal result in searcher.FindAll())
        {
            DirectoryEntry entry = result.GetUnderlyingObject() as DirectoryEntry;
            if (entry.Properties["Company"].Value?.ToString() == "My Company")
            {
                // do some stuff
            }
        }
    }
}

Мне просто интересно, можно ли было бы сделать оператор LINQ вместо оператора if, чтобы получать только те записи, которые меня интересуют.

Примерно так:

foreach (var entry in searcher.FindAll()
    .Where(x => x.GetUnderlyingObject<DirectoryEntries>()
    .Properties["Company"].Value?.ToString() == "MY Company"))
{
    // do some stuff
}

Ответы [ 3 ]

3 голосов
/ 12 марта 2019

Это должно быть возможно. Сначала вы можете использовать Select(), чтобы привести объект к DirectoryEntry. Примерно так должно работать:

var entry = searcher.FindAll()
    .Select(x => (DirectoryEntry)x.GetUnderlyingObject())
    .Where(x => x.Properties["Company"].Value?.ToString() == "My Company")
    .FirstOrDefault();  // or .ToList() depending on your requirements

if (entry != null)
{
    // do some stuff
}
1 голос
/ 12 марта 2019

Вам не нужно foreach. Попробуйте это:

var myCompany = searcher.FindAll()
    .Select(x => (DirectoryEntry)x.GetUnderlyingObject())
    .Where(x => x.Properties["Company"].Value?.ToString() == "MY Company")
    .ToList();

if (myCompany != null)
    // Do something with myCompany

Не по теме: вы можете сложить using операторов, чтобы избежать вложенности:

using (var context = new PrincipalContext(ContextType.Domain, adDomain))
using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
{
    // Do stuff
}
0 голосов
/ 12 марта 2019

Да, Брайан, это похоже на решение. У меня нет типов всего, что можно протестировать, но это с ToList () в конце, чтобы позволить foreach итерировать, должно работать.

Я бы поставил его над foreach в переменной, чтобы увидеть список, который он создает до итерации.

...