C#使用linq将列转换为行?

时间:2016-07-28 13:09:37

标签: c# linq

我有以下表格结构。我想检索与每个组名的键对应的值,并将其插入到模型类

表数据已使用ExecuteQuery读取并存储在类对象列表中,在下面的示例中,我将返回4行。我需要将其转换为2行,列值以行的形式出现。

Table Data Structure
我现在编写了以下代码,但是有没有其他方法来验证它而没有明确地检查说Key == "GroupSpecificProperty1"

如果以后添加了第3类,我不必修改此代码

Result = results.GroupBy(p => p.GroupName )
                .Select(g => new FinalModel()
    {
        GroupName = g.Select(p => p.GroupName ).FirstOrDefault(),
        GroupSpecificProperty1 = g.Where(q => q.Key == "GroupSpecificProperty1").Select(v => v.Value).Cast<string>().FirstOrDefault(),
        GroupSpecificProperty2= g.Where(q => q.Key == "GroupSpecificProperty2").Select(v => v.Value).Cast<string>().FirstOrDefault(),
    }).ToList();

1 个答案:

答案 0 :(得分:4)

results.GroupBy(p => p.GroupName)
            .Select(g => new FinalModel
            {
                GroupName = g.Key,
                Properties = g.ToDictionary(item => item.Key, item=> item.Value)
            });  

如果对于给定的GroupName,密钥不是唯一的,并且您想要避免“密钥已存在”异常,那么您可以:

results.GroupBy(p => p.GroupName)
        .Select(g => new FinalModel
        {
            GroupName = g.Key,
            Properties = g.GroupBy(item => item.key)
                          .ToDictionary(innerGroup => innerGroup.Key, 
                                        innerGroup =>  innerGroup.Select(innerItem => innerItem.Value))
        });   

当然,如果更好地满足您的需求,您还可以使用LookUp替换外/内词典。