Select 属性(内部 SELECT)在带有 GroupBy 的 LINQ 中

Select properties (inner SELECT) in LINQ with GroupBy

我有一个事件列表,这些事件基于它们的 eventId 和 start/end 次是唯一的,但除此之外它们是相同的。因此,例如,我的数据项看起来像这样...

eventItem.EventId
eventItem.EventTypeId
eventItem.StartDateTime 
eventItem.EndDateTime
eventItem.Available
eventItem.ShowSystemName

我的数据集看起来像这样...

408277 110 5/26/2021 3:00:00 PM 5/26/2021 3:45:00 PM 100 Event 1 
408551 109 5/26/2021 4:00:00 PM 5/26/2021 4:45:00 PM 100 Event 2 
408124 110 5/27/2021 10:30:00 AM 5/27/2021 11:15:00 AM 100 Event 1 
408398 109 5/27/2021 11:30:00 AM 5/27/2021 12:15:00 PM 100 Event 2 
408201 110 5/27/2021 1:00:00 PM 5/27/2021 1:45:00 PM 100 Event 1 
408475 109 5/27/2021 2:00:00 PM 5/27/2021 2:45:00 PM 100 Event 2 
408278 110 5/27/2021 3:00:00 PM 5/27/2021 3:45:00 PM 100 Event 1 
408552 109 5/27/2021 4:00:00 PM 5/27/2021 4:45:00 PM 100 Event 2

我希望从该数据中查询 return 每个唯一事件仅一次(基于 ShowSystemName),然后是该事件的子项列表。有点像..

Event 1
    408277 110 5/26/2021 3:00:00 PM 5/26/2021 3:45:00 PM
    408124 110 5/27/2021 10:30:00 AM 5/27/2021 11:15:00 AM 
    408201 110 5/27/2021 1:00:00 PM 5/27/2021 1:45:00 PM
    408278 110 5/27/2021 3:00:00 PM 5/27/2021 3:45:00 PM
 
Event 2
    408398 109 5/27/2021 11:30:00 AM 5/27/2021 12:15:00 PM
    408475 109 5/27/2021 2:00:00 PM 5/27/2021 2:45:00 PM 
    408552 109 5/27/2021 4:00:00 PM 5/27/2021 4:45:00 PM
    408551 109 5/26/2021 4:00:00 PM 5/26/2021 4:45:00 PM 

我已经开始

foreach(var eventItem in result.Events.GroupBy(x => x.ShowSystemName).Select(x => x.First()))
{
    ...
}

这让我按预期只得到一次事件,但我正在努力做一个内部 select。

我在 Razor 工作,因为最终这将呈现为 HTML,但由于事件的服务器调用也是我的代码,如果我愿意的话,我可以将此逻辑移至服务调用中任何东西。

谢谢!

GroupBy() 不会 return 事件项目,而是 事件项目。具体来说,它是 IGrouping<TKey, TElement>IEnumerable,其中 TKey 是您分组依据的类型(string),TElement 是您的事件 class.

您可以使用 IGrouping<TKey, TElement>.Key 属性 访问组的公共键,也可以使用 foreach.

遍历每个组

因此,嵌套循环应该会得到预期的输出:

foreach (var eventGroup in result.Events.GroupBy(x => x.ShowSystemName))
{
    Console.WriteLine(eventGroup.Key);

    foreach (var eventItem in eventGroup)
    {
        Console.WriteLine($"\t{eventItem.EventId} {eventItem.EventTypeId} ...")
    }
}