2013-07-03 51 views
1

通过字段中选择属性我有一个对象Record集团使用LINQ

它包含以下属性:

Guid RecordId

​​

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作为分组字段。

回答

3

试试这个:

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

GUID是相当独特的,所以你应该能够全部,但 - 当然只是通过比较它们的ID匹配(因而深受组)的用户。


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

Records.GroupBy(m => m.UserId) 

但是请注意,这只会工作,如果你正在执行给定Record对象的UserId属性必须在UserId匹配属于所述Record对象的User对象的属性。


侧面说明:在你的OP,你提到,在数据的不匹配可能导致有User对象具有相同UserId。如果您正在寻找合并“重复”(即,有些属性可能会有所不同,但UserId是一样的),该GroupBy方法将帮助您组织记录每个用户。然而,如果记录都具有相同的属性,你可能有兴趣在使用Distinct方法,因为它可以传递一个lambda,可以用来选择一个Record对象为每个UserId是存在。

+0

问题是,这是我现在有:'的IEnumerable >',但你的方法,我得到这样的结果:'的IEnumerable >'。我失去了'用户'键。我想'User'作为关键词,但是'UserId'作为groupby选择器。 – YesMan85

+0

如果是这样的话,那么你需要写一个'User'的相等比较为(伪):'return u1.UserID == u2.UserID;'。在你做完这些之后,你将能够'GroupBy'用户。 –

+0

请问为什么,如果你有'Record'作为值,'Record'包含'User',你想让用户自己成为分组键? –