2013-07-24 28 views
0

我已经在C#中定义如下DTO对象:使用LINQ分组在记录表

public class Record 
{ 
    public List<EventType> EventTypes { get; set; } 
} 

,并具有列表<记录>填充,而事件类型之后被定义为枚举现在

public Enum EventType { 
    UNLOCK = 1, 
    LOCK = 2 
} 

我想做出与记录清单类似的报告:

count  Name 
=====  ====== 
3   UNLOCK 
1   LOCK 

...通过使用(很可能是LINQ组)。制定这份清单的最佳方法是什么?我假设我将不得不制作另一个将保存这些数据的DTO。

+1

你试过了什么?你检查过了吗? http://www.codeproject.com/Articles/35667/How-to-Use-LINQ-GroupBy – seshuk

回答

3

根据你想拥有所产生的数据类型,可以使用以下两种:

var result = records.SelectMany(x => x.EventTypes) 
        .GroupBy(x => x) 
        .ToDictionary(x => x.Key, x => x.Count()); 

var result = records.SelectMany(x => x.EventTypes) 
        .GroupBy(x => x) 
        .Select(x => new { Name = x.Key, Count = x.Count()); 

var result = records.SelectMany(x => x.EventTypes) 
        .GroupBy(x => x) 
        .Select(x => new YourType(x.Key, x.Count())); 

第一个将导致与事件类型是关键和其发生的数字典该列表作为值。

第二个会导致一个匿名类型的枚举,其中两个属性NameCount

第三个将导致YourType类型的枚举,该类型将事件类型及其出现次数传递给其构造函数。

+1

'record'应该被'records.SelectMany(r => r.EventTypes)' – GolfWolf

+0

@ w0lf替换:事实上,谢谢。我不知怎么读了'List '。 –

+1

谢谢,第三项是我刚刚尝试实现的:) – user576700