2013-07-03 152 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',你想讓用戶自己成爲分組鍵? –