Linq Where 子句根据不同列表的结果生成列表

Linq Where clause to generate List based on results of a different List

我正在尝试使用具有来自不同 List<Object> 的属性的 Where 子句生成 List<Object>。我知道我可以使用 .Include(),类似于 SQL 连接,如果我使用 Entity Framework 但我没有使用 Entity Framework,所以我认为它不会起作用.我有:

List<Problem> problems = MethodToCallDbAndGenerateList();  //ado.net
problems = problems.Where(x => x.Property1 == "value").ToList();
//remaining logic

List<Solved> solved = MethodToCallDb()
                      .Where(x => x.SolvedId == problems.ProblemId)
                      .ToList();
             //error happens in Where(...problems.ProblemId);
         //List<Problem> does not contain a definition for ProblemId

错误说 List<Problem> 不包含 ProblemId 但我的 class 中确实有 属性。所以我不确定为什么会收到该错误。

如何根据

的过滤结果生成我的 List<Solved>

.Where(x => x.SolvedId == problems.SolvedId);

使用 LINQ to Objects,您可以使用 Enumerable.Join 方法在两个 List<T> 和 return 匹配成员之间创建连接:

List<Problem> problems = MethodToCallDbAndGenerateList()
                            .Where(x => x.Property1 == "value")
                            .ToList();

List<Solved> solved = MethodToCallDb()
                      .Join(problems, s => s.SolvedId, p => p.ProblemId, (s,p) => s)
                      .ToList();

但是,如果有很多 problemssolved,或者如果您经常检查 problems 的相同列表,或者如果您只是创建 problems ] 在 join 中使用,你最好创建一个 HashSet:

var problemIDs = problems.Select(p => p.ProblemId).ToHashSet();

List<Solved> solved = MethodToCallDb()
                      .Where(s => problemIDs.Contains(s.SolvedId))
                      .ToList();

注意:如果您只是创建 problems 以在连接中使用,最好跳过创建 List<Problem> 并直接执行:

var problemIDs = MethodToCallDbAndGenerateList()
                    .Where(x => x.Property1 == "value")
                    .Select(p => p.ProblemId)
                    .ToHashSet();