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;

Linq查询按distinct分组

我意识到这是一个老问题,希望你早就知道了。但对于其他人来说,以下是你如何解决这个问题:

首先,您需要将每个组的可用时间添加到您选择的匿名对象中,这样您就有办法在分组后将它们取回。去掉末尾的.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