2015-12-07 6 views
0

Я пытаюсь построить выражение лямбды с сервалом, где предложения друг с другом.Linq Lambda Where clause with in where where

Элементы, webProperties и профили - все эти списки. Я пытаюсь найти тот, который содержит профиль, который состоит из 3-х уровней. На самом деле все, что я действительно пытаюсь сделать, это подтвердить, что он существует.

var x = AccountSummeriesResponse.items.Where(wp => wp.webProperties.Where(p => p.profiles.Where(a => a.id == profile))).FirstOrDefault(); 

Я получаю следующее сообщение об ошибке.

Не может неявно преобразовать тип 'System.Collections.Generic.IEnumerable' к 'BOOL'

ответ

7

probelm является Enumerable.Where возвращает IEnumarable<T> но предикат Where ожидает boolen. Вы можете использовать Any вместо: -

var x = AccountSummeriesResponse.items 
      .Where(wp => wp.webProperties.Any(p => p.profiles.Any(a => a.id == profile))) 
      .FirstOrDefault(); 

Кроме того, вы можете заменить Where с FirstOrDefault, как это: -

var x = AccountSummeriesResponse.items 
     .FirstOrDefault(wp => wp.webProperties.Any(p => p.profiles 
               .Any(a => a.id == profile))); 
+1

Вы сэр мой герой, я пытался играть с любым и не мог заставить его Работа. – DaImTo

0

Это потому, что делегат (Predicate) внутри где положение должно возвращать логическое значение и вы возвращают IEnumerable (Where(p => p.profiles.Where(a => a.id == profile))), сообщая об ошибке компиляции.

Вместо сделать использование Any метода расширения, если вы ищете, существует ли в коллекции рода вещи ..

var x = AccountSummeriesResponse.items.Where(wp => wp.webProperties.Any(p => p.profiles.Any(a => a.id == profile))).FirstOrDefault();