2016-08-02 81 views
2

好吧,这对我来说是一个相当有趣的问题,所以我会尽我所能去努力以一种你能理解的方式来问这个问题。尝试过滤使用LINQ的集合,其中集合也具有可为空的属性的集合

因此,我有一个对象集合,其中包含一个对象集合,其中包含一个对象集合,其中有一个属性有时可以为null。

它看起来是这样的伪代码:

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

好了,现在我基本上需要过滤掉所有ObjectC的其中属性= someValue中或属性为null。

我尝试这样做:(请记住,这仅仅是一个例子,不是真正的代码)

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 == nullcollectionC == null

编辑: 什么我真的想做到的是,如果一些c.Property =“x”和一些c.Property =“Y”和一些c.Property = NULL,我想从我的collection什么地方删除c.Property ='x',但留下剩下的。

+1

你确定你的意思是'好吧,现在我基本上需要过滤掉所有的ObjectC,其中property = someValue或者它不是null'任何等于“somevalue”的东西都必须是nonNull。所以这相当于所有具有非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

很高兴帮助,我没有清楚地知道应该是什么情况 –