2016-07-28 7 views
0

私はほぼ完了しているlinqクエリを持っています。 これは動作していますが、要件を満たすリストのアイテムの元のリストを取得する必要があります。区別するLinqクエリグループ

count > numberOfResourceToBookがある場合はtrueまたはfalseを返します。

代わりに、そのすべてのプロパティを持つavailableTimesのすべての商品を返品したいと考えています。

bool enoughResourceAvailable = availableTimes.GroupBy(l => new { l.From, l.To }) 
    .Select(g => new 
    { 
     Date = g.Key, 
     Count = g.Select(l => l.ResourceId).Distinct().Count() 
    }).Where(c => c.Count >= numberOfResourcesToBook).Count() > 0; 
+1

あなたの匿名のタイプなどで、 'Entries = g.Where(l => l.ResourceId).Distinct()'が必要なように聞こえるかもしれません。もしそうでなければ、あなたの説明が本当にはっきりしないので、[mcve]。 –

+1

最初のステップは、あなたが呼び出した最後のLINQクエリを見ることです。ご覧のように、あなたは '.Count()> 0'を返します。これはブール値を返すステートメントで、なぜIEnumerable が得られますか? – plusheen

+0

最後の 'Count()> 0'は何のために必要ですか? – schlonzo

答えて

0

私は、これは古い問題であり、うまくいけば、あなたはすでにずっと前にこれを考え出し実現。しかし、他の誰かがこの問題に悩まされている場合、ここであなたがそれを解決する方法は次のとおりです:

最初に、選択している匿名オブジェクトに各グループの利用可能時間を追加する必要がありますグループ化。最後に.Count > 0を取り除いて、結果はブール値ではなく匿名オブジェクトのIEnumerableになります。

var result = availableTimes 
    .GroupBy(l => new { l.From, l.To }) 
    .Select(g => new 
    { 
     Date = g.Key, 
     Count = g.Select(l => l.ResourceId).Distinct().Count(), 
     Times = g.Select(l => l)  // Add this to capture the times for the group 
    }) 
    .Where(c => c.Count >= numberOfResourcesToBook); 

次は、以前の結果に.Any()を使用してenoughResourceAvailableを設定することができます。 .Count() > 0と同じ仕事をしますが、必ずしもリスト全体を列挙する必要はありません。少なくとも1つのアイテムが見つかるとすぐにtrueを返します。

bool enoughResourceAvailable = result.Any(); 

最後に、(もしあれば)クエリと一致し、バックすべての時間を得るために、あなたがそうのように、結果にSelectMany()を使用することができます。

var allMatchingTimes = result.SelectMany(c => c.Times); 

の作業のデモ:https://dotnetfiddle.net/HCEuMR

+0

非常に良い!ありがとうございました!! – Krillehbg

関連する問題