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();
但是,如果有很多 problems
和 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();
我正在尝试使用具有来自不同 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();
但是,如果有很多 problems
和 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();