Как использовать LINQ, чтобы найти, содержит ли какое-либо значение в ResultPropertyCollection определенную подстроку? - PullRequest
4 голосов
/ 09 ноября 2011

Как использовать LINQ, чтобы найти, содержит ли какое-либо значение в ResultPropertyCollection определенную подстроку?

Справочная информация. После переименования моей фирмы работодателя я хочу проверить, все ли пользователи имеют новый псевдоним электронной почты, который указан в Active Directory как proxyAddresses. Прямой доступ к отдельным значениям внутри ResultPropertyCollection работает просто отлично, например так:

DirectorySearcher mySearcher = new DirectorySearcher(mySearchRoot, myFilter, myPropertiesList);
myResults = mySearcher.FindAll();

var query = from SearchResult myResult in myResults
    where (myResult.Properties["proxyAddresses"][0].ToString().Contains ("WeNeedThis.com"))
    select myResult;

Но мне не удается найти все значения в коллекции. Кажется, я не могу понять, какой тип переменной является правильным:

where (from WhatType? myAddress in myResult.Properties["proxyAddresses"] 
    where (myAddress.Contains("WeNeedThis.com"))    
    select myAddress)

Как мне установить предложение where, чтобы оно обнаруживало вхождение строки поиска в любое значение proxyAddresses?

Ответ: Оказывается, это правильное предложение where:

   where ( ( from String myAddress in myResult.Properties["proxyAddresses"]
       where myAddress.Contains("WeNeedThis.com") 
       select myAddress).ToList().Count == 0)

Были переплетены две ошибки: внешнему выражению where требуется логический результат от результата внутреннего выбора, который достигается с помощью .ToList (). Count == 0. Тип переменной диапазона действительно String = myResult.Properties ["proxyAddresses"] [0] .GetType (), хотя коллекция не имеет прямых членов String. Я неправильно интерпретировал полученную ошибку компилятора.

Ответы [ 4 ]

1 голос
/ 09 ноября 2011

Тип, который вы ищете, мне кажется, ResultPropertyValueCollection .

Но разве вы не можете опустить вывод типа и использовать тип?

from myAddress in myResult.Properties["proxyAddresses"]

Также вместо использования IndexOf(str) > 0 в качестве предиката вы можете использовать Contains(str).

0 голосов
/ 29 декабря 2016

Имя свойства System.DirectoryServices.ResultPropertyCollection имеет тип Hashtable + Keycollection.Я бы разыграл его и проверил, существует ли он, а затем получил бы значение:

System.DirectoryServices.DirectorySearcher mySearcher = new DirectorySearcher(mySearchRoot, myFilter, myPropertiesList);
System.DirectoryServices.SearchResultCollection myResults = mySearcher.FindAll();
foreach (System.DirectoryServices.SearchResult result in myResults)
{
   var propertyNames = result.Properties.PropertyNames.Cast<String>().ToList<String>();
   if (!propertyNames.Contains("proxyaddresses")) 
   {
      // This property does not exist. Abort.
      continue;
   }
   List<string> proxyAddresses = result.Properties["proxyaddresses"].Cast<String>().ToList();
   // Do something with proxyAddresses
}
0 голосов
/ 29 апреля 2015

Это сработало для меня

DirectorySearcher mySearcher = new DirectorySearcher(mySearchRoot, myFilter, myPropertiesList);
myResults = mySearcher.FindAll();

var query = myResults.Where(res =>res.GetDirectoryEntry().Properties["proxyAddresses"].Cast<string>().Any(addr => addr.Contains("WeNeedThis.com")));
0 голосов
/ 09 ноября 2011

Вам нужно будет использовать что-то вроде этого:

var query =
    from myAddress in
        (myResult.Properties["proxyAddresses"] as IEnumerable).OfType<string>()
    where myAddress
        .ToLowerInvariant()
        .Contains("WeNeedThis.com".ToLowerInvariant())
    select myAddress ;

Помогает ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...