2016-11-03 3 views
1

У меня есть следующий запрос LINQ, который обрабатывает строку, и я хочу изменить ее для работы с массивом. Как мне это сделать?Запрос LINQ, чтобы проверить, содержит ли массив поисковый запрос

Это запрос LINQ на данный момент (где FilteredString - это строка). Он отлично работает:

var xFiltered = Services.Where(x => 
    x.Name.ToUpper().Contains(xFilteredString.ToUpper() || 
    x.Hosts.Select(y => y.Name) 
      .Any(y => y.ToUpper().Contains(xFilteredString.ToUpper())))); 

Однако, я изо всех сил, чтобы заставить его работать в этом случае (следующий код не работает), где я проверяю, если массив содержит определенное значение:

var xFilteredArray = xFilteredString.Split(',') 
var xFilteredArrayToUpper = xFilteredArray.Select(s => s.ToUpperInvariant()); 

var xFiltered = Services(Where x => 
    x.Name.ToUpper().Any(y => xFilteredArrayToUpper.All(x.Name.Contains) || 
    x.Hosts.Select(y => y.Name) 
      .Any(y => y.ToUpper().Contains(xFilteredArrayToUpper.All(x.Name.Contains))))); 

Как это исправить?

+0

В этот момент во втором кодовом блоке: 'x.Hosts.Select (y => y.Name). Любой (y => y.ToUpper()' вы хотите см., если 'xFilteredArrayToUpper' содержит' y.ToUpper() '? – Gavin

+0

Нет, я пытался сделать его заглавным – methuselah

+0

Я имею в виду, когда вы вызываете' y.ToUpper() '.. Я оставил остальную часть, потому что это неправильно и неясно, что вы хотите, чтобы вы получили имена хостов, .ToUpper() 'их, а затем что? – Gavin

ответ

2

Если я правильно понимаю, то это так. Вы хотите Chech для каждого элемента в filterArray, если какой-либо из это значений содержится в x.Name или y.Name:

var filterArray = xFilteredString.Split(',') 
           .Select(s => s.ToUpperInvariant()) 
           .ToList(); 

var result = Services.Where(x => 
       filterArray.Any(filter => x.Name.ToUpper().Contains(filter) || 
       x.Hosts.Any(y => filterArray.Any(filter => y.Name.ToUpper().Contains(filter)))); 

Я думаю, что более читаемым способом будет использовать синтаксис запроса:

var filterArray = xFilteredString.Split(',') 
           .Select(s => s.ToUpperInvariant()) 
           .ToList(); 

var result = from x in Services 
      let upperName = x.Name.ToUpper() 
      where filterArray.Any(filter => upperName.Contains(filter)) || 
        x.Hosts.Select(host => host.Name.ToUpper()) 
          .Any(host => filterArray.Any(filter => host.Contains(filter))) 
      select x; 

Использование let и Hosts.Select, которые у меня нет в синтаксисе метода, поэтому ToUpper выполняется один раз для каждого проверенного значения и не один раз для каждого значения в filterArray тоже

Также я решил объединить различные операции для создания filterArray. Я думаю, что более понятно, что путь

+0

@methuselah - Рад, что это помогло вам :) –

+1

Спасибо, что вы спасли меня много времени! – methuselah

+0

Быстрый вопрос, если бы я хотел проверить хосты => tags => tagName, как бы я это сделал? – methuselah

Смежные вопросы