[英]Linq query and potential self join/group by
Suffering sadly from brain fade.可悲地患有大脑衰退。 I have the following scenario:我有以下情况:
void Main()
{
List<CaseBase> caseList = new List<UserQuery.CaseBase>();
caseList.Add(new CaseBase() {CaseID = 1, CaseSequence = 1, CaseStatus = 1});
caseList.Add(new CaseBase() {CaseID = 1, CaseSequence = 2, CaseStatus = 2});
caseList.Add(new CaseBase() {CaseID = 2, CaseSequence = 1, CaseStatus = 1});
var cases = caseList.Where(x => new List<int> {2}.Contains(x.CaseStatus));
}
// Define other methods and classes here
public class CaseBase
{
public int CaseID {get;set;}
public int CaseSequence {get;set;}
public int CaseStatus {get;set;}
}
Which returns the expected返回预期的
CaseID案例ID | CaseSequence案例序列 | CaseStatus案例状态 |
---|---|---|
1 1 | 2 2 | 2 2 |
What I want are all cases with the same ID where one of them has a status of 2.我想要的是所有具有相同 ID 的案例,其中一个的状态为 2。
CaseID案例ID | CaseSequence案例序列 | CaseStatus案例状态 |
---|---|---|
1 1 | 1 1 | 1 1 |
1 1 | 2 2 | 2 2 |
Which should be simple but I'm struggling for a simple solution.这应该很简单,但我正在努力寻找一个简单的解决方案。
There are a couple of ways to proceed:有几种方法可以继续:
You can combine the cases by CaseID
and select the matching groups and then break them apart:您可以通过CaseID
和 select 将匹配组组合起来,然后将它们分开:
var cases = caseList.GroupBy(c => c.CaseID).Where(cg => cg.Any(c => new List<int> { 2 }.Contains(c.CaseStatus))).SelectMany(cg => cg);
You can find the desired CaseID
s and then get all matching cases:您可以找到所需的CaseID
,然后获取所有匹配的案例:
var wantedCaseIDs = caseList.Where(c => new List<int> { 2 }.Contains(c.CaseStatus)).Select(c => c.CaseID).ToHashSet(); var cases = caseList.Where(c => wantedCaseIDs.Contains(c.CaseID));
Or you might want to do it like this:或者你可能想这样做:
void Main()
{
List<CaseBase> caseList = new List<UserQuery.CaseBase>();
caseList.Add(new CaseBase() { CaseID = 1, CaseSequence = 1, CaseStatus = 1 });
caseList.Add(new CaseBase() { CaseID = 1, CaseSequence = 2, CaseStatus = 2 });
caseList.Add(new CaseBase() { CaseID = 2, CaseSequence = 1, CaseStatus = 1 });
var cases = caseList.Where(x => new List<int> { 2 }.Contains(x.CaseStatus))
.Join(caseList,x => x.CaseID,y => y.CaseID,(x,y) => new {x,y})
.Select(z => z.y)
.Dump();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.