Фильтруйте список объектов, используя свойство, которое является другим списком. Используя linq - PullRequest
1 голос
/ 20 апреля 2010

У меня хорошая ситуация, я думаю, что в начале это обычный запрос, но у меня возникла некоторая проблема, пытаясь решить эту проблему, ситуация:

У меня есть список "Домов", и у каждого дома есть список "Окна". И я хочу отфильтровать по каталогу только дома с голубыми окнами, поэтому мой метод расширения House выглядит примерно так:

public static List<House> FilterByWindow (this IEnumerable<House> houses, Window blueOne){

    var list = houses.Select(p=>p.Windows.Where(q=>q.Color == blueOne.Color));
    return list.ToList();
}

Это правильно или я что-то теряю? Лучшее предложение?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2010
return houses.Where(house => house.Windows.Any(window => window.Color == blue))
             .ToList();
2 голосов
/ 20 апреля 2010

Если вы хотите найти House экземпляры, содержащие синий Windows, используйте существующее расширение Any:

var blueWindowHouses =
    from h in houses
    where h.Windows.Any(w => w.Color == blueOne.Color)
    select h;

То, что вы сейчас имеете, это не правильно. Расширение Select не фильтрует - это проекция, и вы никому не присваиваете результат, так что ваша строка фактически не используется.

Кроме того, оборачивая эту логику в метод, вы можете помешать компилятору выражений преобразовать ее в оператор SQL. Вместо этого, запишите все в одном кадре, как я выше, или примите и верните IQueryable<House> вместо того, чтобы принять IEnumerable<House> и вернуть List<House>.

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