使用Linq按字段选择属性分组

时间:2013-07-03 16:44:08

标签: c# linq

我有一个对象Record

它包含以下属性:

Guid RecordId

User User

Guid UserId

现在我必须进行分组并使用此Linq查询:

Records.GroupBy(m => m.User)

问题是User对象是从2个位置填充的,有时数据不匹配属性,导致单个UserId

有多个结果

例如:

List<Record> 
{
    new Record 
    {
        RecordId = 1,
        User = new User 
        {
            UserId = 1,
            UserName = '1',
            OtherProperty = false
        }
        UserId = 1
    },
    new Record 
    {
        RecordId = 2,
        User = new User 
        {
            UserId = 1,
            UserName = '1',
            OtherProperty = true
        }
        UserId = 1
    },
    new Record 
    {
        RecordId = 3,
        User = new User 
        {
            UserId = 2,
            UserName = '2',
            OtherProperty = false
        }
        UserId = 2
    }
}

OtherProperty对象中的User不同,导致无法分组。

我需要User对象进行分组,但实际上使用UserId作为分组字段。

1 个答案:

答案 0 :(得分:3)

试试这个:

Records.GroupBy(m => m.User.UserId)

GUID是相当独特的,因此您应该只需通过比较其ID就可以完全匹配(并因此分组)用户。


作为替代方案,这可能是一个更简单的解决方案:

Records.GroupBy(m => m.UserId)

但是,请注意,这只有在您强制执行给定UserId对象的Record属性必须与UserId对象的User属性匹配时才有效属于所述Record对象。


旁注:在您的OP中,您提到数据不匹配会导致User个对象具有相同的UserId。如果您要合并“重复项”(即某些属性可能不同,但UserId相同),GroupBy方法将帮助您组织每个用户的记录。但是,如果记录都具有相同的属性,您可能会对使用Distinct方法感兴趣,因为它可以传递lambda并可用于为每个{{1}选择一个Record对象存在的。