Linq查询按distinct分组
本文关键字:分组 distinct 查询 Linq | 更新日期: 2023-09-27 17:59:13
我有一个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);
接下来,您可以通过对上一个结果使用.Any()
来设置enoughResourceAvailable
。它所做的工作与.Count() > 0
相同,只是它并不总是需要枚举整个列表:只要找到至少一个项,它就可以返回true。
bool enoughResourceAvailable = result.Any();
最后,要返回与查询匹配的所有时间(如果有的话),可以对结果使用SelectMany()
,如下所示:
var allMatchingTimes = result.SelectMany(c => c.Times);
工作演示:https://dotnetfiddle.net/HCEuMR