不同

时间:2016-07-28 13:50:20

标签: c# 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 个答案:

答案 0 :(得分: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()。它与.Count() > 0完成相同的工作,除了它并不总是需要枚举整个列表:它一旦找到至少一个项就可以返回true。

bool enoughResourceAvailable = result.Any();

最后,要获得与查询匹配的所有时间(如果有的话),您可以对结果使用SelectMany(),如下所示:

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

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