首页 > 解决方案 > Linq Where 子句根据不同列表的结果生成列表

问题描述

我正在尝试使用不同的属性生成List<Object>using子句。我知道如果我使用的是实体框架,我可以使用类似于 SQL 连接的 ,但我没有使用实体框架,所以我认为它不会起作用。我有:WhereList<Object>.Include()

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,但我的班级中确实有该属性。所以我不确定我为什么会收到这个错误。

如何List<Solved>根据过滤结果生成我的

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

标签: c#linqado.net

解决方案


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

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

但是,如果有很多problemsand solved,或者如果您经常检查相同的 列表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();

推荐阅读