2016-07-28 84 views
0

我有一個幾乎完整的linq查詢。 它正在工作,但我需要檢索滿足要求的列表中的項目的原始列表。不同的Linq查詢組

現在它只返回true或false,如果有的話count > numberOfResourceToBook

但是相反,我想返回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的作用相同,只是它並不總是需要列舉整個列表:只要它找到至少一個項目,它就可以返回true。

bool enoughResourceAvailable = result.Any(); 

最後,把所有的時間回到它相匹配的查詢(如果有的話),你可以在結果上使用SelectMany(),就像這樣:

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

工作演示:https://dotnetfiddle.net/HCEuMR

+0

非常好!謝謝!! – Krillehbg