2016-08-02 2 views
2

Хорошо, это была довольно интересная проблема для меня, поэтому я постараюсь сделать все возможное, чтобы спросите об этом таким образом, чтобы вы могли понять.Попытка фильтровать коллекцию с использованием LINQ, где коллекция имеет коллекцию, которая также имеет коллекцию с свойством, которое является нулевым

Итак, у меня есть коллекция объектов, которая содержит коллекцию объектов, которая содержит коллекцию объектов, которая имеет свойство, которое иногда может быть нулевым.

Это выглядит как этот псевдокод:

Class ObjectA { 
public IEnumberable<ObjectB> 
} 
Class ObjectB { 
public IEnumberable<ObjectC> 
} 
Class ObjectC { 
property? a; 
} 

Хорошо, теперь я в принципе нужно отфильтровать все ObjectC, где свойство = SomeValue или свойство равно нулю.

Я попытался это: (помните, что это всего лишь пример, а не реальный код)

IEnumberable<ClassA> collection; 
List<string> filters; // This contains a list of filters 
collection = collection.Where(a => a.collectionB.All(b => 
    b.collectionC.Where(c => !filter 
     .Contains(c.Property))? 
     .Count() == 0)) 
     .ToList(); 

Таким образом, проблема заключается в том, что если я сопрягать фильтр к c.Property ничего не происходит. Он должен удалить тот из collection, но это не так. Мне также не нужно отфильтровывать какие-либо из них, где c.Property == null или collectionC == null.

EDIT: То, что я на самом деле пытаетесь достичь, если некоторые c.Property = «х» и некоторые c.Property = «у» и некоторые c.Property = NULL, я хочу, чтобы удалить из моего collection что-нибудь где c.Property = 'x', но остальное.

+1

Вы действительно действительно имеете в виду «Хорошо, теперь мне в основном нужно отфильтровать все объекты ObjectC, где свойство = someValue ИЛИ это не пусто» ?? Все, что равно 'somevalue', должно быть неNull. Итак, это будет эквивалентно всем ClassC с ненулевыми значениями свойства. –

+0

Отредактировал мой вопрос для разъяснения – Allen

ответ

1
collection.Where(a=>a.collectionB.Any(b=> b.collectionC == null || 
    b.collectionC.Any(c=>c.Property == null || filters.Contains(c.Property)))) 
+0

Это почти то же самое решение. Измените последнюю часть на c => c.Property == null &&! Filters.Contains (c.property), и это исправлено для меня. – Allen

+0

Рад, что это помогло, я не понял, что именно должно быть –

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