2011-05-19 132 views
2

使用在儿童收集条件我有实体下图:筛选父集合通过LINQ查询

Item 
    IList<Prices>  
    DateTime Opened 
    DateTime? Closed 

Price 
    Name 
    DateTime Opened 
    DateTime? Closed 

如何选择所有项目,其中Closed为空,只有价格在那里Closed为空?

正如你所看到的ItemPrice有有效期,所以我只需要选择有效的项目和有效的价格。

我知道如何选择商品,但我不知道如何限制“嵌套”价格。

​​

回答

3

我想你可能正在寻找类似的东西?

Items.Where(i => !i.Closed.HasValue && i.Prices.Any(p => !p.Closed.HasValue)) 

这将只会选择具有非关闭价格的物品。

如果你想真正得到每个项目不关闭价格清单,我会切换到LINQ语法和做这样的事情:

from i in Items 
where !i.Closed.HasValue 
from p in i.Prices 
where !p.Closed.HasValue 
group p by i into itemPrices 
select new { 
    Opened = i.Opened 
    Closed = i.Closed 
    Items = itemPrices 
} 
+0

难道不该'Prices.All'? – RPM1984 2011-05-19 23:29:19

+0

它取决于需求是什么 - 任何()都会过滤至少有一个非关闭价格的项目,All()将确保这些项目只有*非关闭价格。 – 2011-05-20 00:01:57

+0

是的,我知道,我的印象是后者的要求。尽管我可能误解了q。 – RPM1984 2011-05-20 00:45:48

2

这?

items 
     .Where(x => x.Closed == null) 
     .Select(x => 
      new Item 
      { 
       Closed = x.Closed, 
       Opened = x.Opened, 
       Prices = new List<Price>(x.Prices.Where(p => p.Closed == null)) 
      }); 
0
from item in items 
where item.Closed == null 
let prices = from price in item.Prices 
      where price.Close == null 
      select price 
select new 
{ 
    Item = item, 
    Prices = prices.ToArray() 
}