2011-05-19 17 views
2
経由

私は、エンティティの次のグラフがあります。ClosedClosedがnull nullで、唯一の価格ですべての項目を選択する方法フィルタの親コレクションのLINQクエリ

Item 
    IList<Prices>  
    DateTime Opened 
    DateTime? Closed 

Price 
    Name 
    DateTime Opened 
    DateTime? 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

? – RPM1984

+0

これは、要件が何であるかによって異なります。Any()は少なくとも1つの非公開価格を持つアイテムをフィルタリングします。All()はそのアイテムが*非*閉値のみを持つことを保証します。 –

+0

はい私は知っている、と私は印象の下にあった要件は後者でした。私はqを間違って読むことができた。 – RPM1984

2

これ?それは `Prices.All`すべきではない

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() 
} 
関連する問題