c# - Linq Where 子句根据不同列表的结果生成列表
问题描述
我正在尝试使用不同的属性生成List<Object>
using子句。我知道如果我使用的是实体框架,我可以使用类似于 SQL 连接的 ,但我没有使用实体框架,所以我认为它不会起作用。我有:Where
List<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);
解决方案
使用 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();
但是,如果有很多problems
and 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();
推荐阅读
- r - 根据 R 中其他列的任何滞后值改变列
- sql-server - IIS 服务器和 Azure 服务器因 SQL CPU 和内存利用率高而挂起,无法进一步处理请求
- firefox - 有没有办法下载 Firefox 的所有插件?
- regex - 如何在 JQ 中使用捕获变量作为字段名?
- django - Django-如何向超级用户或管理员隐藏按钮,但将其显示给普通用户或活跃用户
- solr - 带空格的多值字段中的精确 dismax 搜索
- react-native - 找不到“React-Core”的规范
- python - 如何将当前日期转换为 DD/MM/YYYY
- javascript - 如何使用 ng-pattern 禁止空间
- java - 使用 SpringApplicationBuilder 的 Spring 动态 @Bean 注册在测试中失败