2012-12-16 47 views
1

我期待與linq一起返回處於特定階段的所有PersonID。我的示例數據集 -linq/ef/c# - 返回一組記錄

ID DateCreated Stage PersonID 
1 1/1/2012 A 101 
2 1/1/2012 A 102 
3 1/1/2012 A 103 
4 1/1/2012 A 104 
5 2/1/2012 B 101 
6 3/1/2012 B 102 
7 3/1/2012 B 103 
8 3/1/2012 C 101 
9 4/1/2012 C 102 
10 5/1/2012 C 103 
11 5/1/2012 D 101 

所以,如果我想回到所有那些在階段c我只會得到是PersonID的102,103

任何想法?

+0

任何特殊原因項目「PersonID = 101」不會返回給'Where(p => p.Stage ==「C」)'或者它只是數據/期望錯誤? –

+0

@AlexeiLevenkov他只希望獲得目前處於C階段的人的身份證件,並排除那些尚未到達或已經通過的人員。 – Despertar

回答

2
IEnumerable<int> personIds = DbContext.Table 
    .GroupBy(record => record.PersonID) 
    .Where(group => group.Last().Stage == "c") 
    .Select(group => group.Key) 

這樣,如果一個人一樣,101擁有先進的近階段C,那麼將不予退還,因爲他們的最後一個階段是D. 104也將不予退還,因爲他還沒有達到階段C.對其進行可視化,它會看起來像這樣。最後階段在括號內。

Group: 101 - A, B, C, [D] 
Group: 102 - A, B, [C] 
Group: 103 - A, B, [C] 
Group: 104 - [A] 
+0

是的,在那裏會帶回所有那些有記錄階段c的人,但是我只想在階段c返回那些人。想象一下,舞臺是一個過程a-b-c-d,我只想在c階段展示這些過程。一個地方會帶回所有有c階紀錄的人。 – Tappies

+0

好吧,我明白你的意思了,看我更新的答案。 – Despertar

+0

對我來說看起來不錯,明天會試試看,並讓你知道我是怎麼做到的。 – Tappies

1

所以,我終於得到它在這裏工作是解決方案 -

var query = DbContext.Table 
       .GroupBy(p => p.PersonID) 
       .Select(grp => grp.OrderByDescending(
        d => d.DateCreated).FirstOrDefault() 
       ).Where(a => a.Stage =="C"); 

感謝您的幫助@Despertar。