2012-12-16 49 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。