Linq 查询和潜在的自联接/分组依据

时间:2021-02-18 18:16:20

标签: c# linq

可悲地遭受大脑衰退。我有以下场景:

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;}
}

哪个返回预期

<头>
CaseID 案例序列 案例状态
1 2 2

我想要的是所有具有相同 ID 且其中一个状态为 2 的情况。

<头>
CaseID 案例序列 案例状态
1 1 1
1 2 2

这应该很简单,但我正在努力寻找一个简单的解决方案。

2 个答案:

答案 0 :(得分:1)

有几种方法可以继续:

  1. 您可以通过 CaseID 组合案例并选择匹配的组,然后将它们分开:

    var cases = caseList
                    .GroupBy(c => c.CaseID)
                    .Where(cg => cg.Any(c => new List<int> { 2 }.Contains(c.CaseStatus)))
                    .SelectMany(cg => cg);
    
  2. 您可以找到所需的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));
    

答案 1 :(得分:1)

或者你可能想这样做:

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();

}
相关问题