2017-06-14 35 views
1

這是一個已經問過的問題,但that question只能使用2個屬性,我需要使用3個屬性,所以我複製了大部分文本。LINQ中有兩個屬性的分組

我們,如果我們有像

class Person { 
internal int PersonID; 
internal string car ; 
internal string friend ; 
} 

現在我有這個類的一個列表類的假設:名單的人;

現在這個列表可以有多個相同PersonID的實例,例如。

persons[0] = new Person { PersonID = 1, car = "Ferrari" , friend = "Josh" }; 
persons[1] = new Person { PersonID = 1, car = "BMW" , friend = "Olof"  }; 
persons[2] = new Person { PersonID = 2, car = "Audi" , friend = "Gustaf" }; 

有沒有一種方法,我可以通過personID進行分組,並獲得他擁有的所有汽車和朋友的列表?例如。預期的結果將是

class Result { 
    int PersonID; 
    List<string> cars; 
    List<string> friends; 
} 

從我迄今所做的:

IEnumerable resultsForDisplay = ResultFromSQL_Query.GroupBy(
    p => p.PersonId.ToString(), 
    p => p.car, 
    (key, g) => new { PersonId = key, car = g.ToList()}); 

但我現在被困在獲得friend's陣列中resultsForDisplay

回答

5

當然,你可以執行LINQ查詢上組g,例如:

IEnumerable<Result> resultsForDisplay = from q in ResultFromSQL_Query 
    group q by q.PersonID into g 
    select new Result {PersonID = g.Key,cars = g.Select(x => x.car).ToList(), friends = g.Select(x => x.friend).ToList()};

或用lambda表達式

IEnumerable<Result> results = persons.GroupBy(x => x.PersonID) 
    .Select(g => new Result { PersonID = g.Key, cars = g.Select(x => x.car).ToList(), friends = g.Select(x => x.friend).ToList()};

所以可以執行對一組任何LINQ查詢(其因此表現爲對GROU的元素的IEnumerable<>),就像一個.Select(..),也.Sum(..).Average(..)和其他子查詢,聚合

+0

嗨,請原諒我,但我是Linq和Lambda表達式的新手。你能把這個語法轉換成lambda表達式嗎? –

+0

另外,當我嘗試使用你的語法時,它給了我一個'結果'行'選擇新結果{' 錯誤說 '找不到類型或命名空間名稱'結果'一個使用指令或程序集引用?)' –

+0

@AtifWaqar:是的,這些必須寫在我認爲的一行上。 –