[英]Linq query group by distinct
我有一个接近完成的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;
我意识到这是一个老问题,希望您早已弄清楚了。 但是对于其他陷入这个问题的人来说,这是解决问题的方法:
首先,您需要将每个组的可用时间添加到您选择的匿名对象中,以便您有一种在分组后取回它们的方法。 最后消除.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);
接下来,您可以通过在上一个结果上使用enoughResourceAvailable
.Any()
来设置enoughResourceAvailable
的资源。 它执行与.Count() > 0
相同的工作,不同之处.Count() > 0
它并不总是需要枚举整个列表:找到至少一项就可以返回true。
bool enoughResourceAvailable = result.Any();
最后,要获得与查询匹配的所有时间(如果有的话),可以对结果使用SelectMany()
,如下所示:
var allMatchingTimes = result.SelectMany(c => c.Times);
工作演示: https : //dotnetfiddle.net/HCEuMR
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.