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

C# Linq Where子句根据不同列表的结果生成列表,c#,linq,ado.net,C#,Linq,Ado.net,我正在尝试使用Where子句生成一个列表,该子句具有来自不同列表的属性。我知道我可以使用.Include(),类似于使用实体框架时的SQL连接,但我没有使用实体框架,因此我认为它不起作用。我有: List<Problem> problems = MethodToCallDbAndGenerateList(); //ado.net problems = problems.Where(x => x.Property1 == "value").ToList();

我正在尝试使用
Where
子句生成一个
列表
,该子句具有来自不同
列表
的属性。我知道我可以使用
.Include()
,类似于使用实体框架时的SQL连接,但我没有使用实体框架,因此我认为它不起作用。我有:

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 problems=methodtocalldband generatelist()//ado.net
问题=问题。其中(x=>x.Property1==“value”).ToList();
//剩余逻辑
List solved=MethodToCallDb()
.Where(x=>x.SolvedId==problems.ProblemId)
.ToList();
//错误发生在以下位置(…problems.ProblemId);
//列表不包含ProblemId的定义
错误表明
列表
不包含
ProblemId
,但我的类中确实有该属性。所以我不确定我为什么会犯这样的错误

如何根据从中筛选的结果生成我的
列表


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

使用LINQ to对象,您可以使用
Enumerable.Join
方法在两个
列表
之间创建连接,并仅返回匹配的成员:

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();
注意:如果只创建要在联接中使用的
问题
,最好跳过创建
列表
,只需执行以下操作:

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

在C#中,类型就是一切。
问题的类型为
列表
。类
列表
没有名为
ProblemId
的属性。
列表
中的单个成员属于
问题类
,他们很可能拥有该属性,但这与
列表
无关。那么,您要针对存储在
列表中的
问题集测试什么呢?我想您刚刚回答了我的问题。我将不得不稍后再看,但我猜我将能够循环并拥有
.Where(..…problems.ElementAt(I).ProblemId)我需要对它进行索引,得到一个实例:<代码>问题。问题ID <代码>。在C语言中,这将是<代码>问题[i]。你把我引向了正确的方向。基本上没有使用实体框架,也没有使用
.Include()
我基本上是在尝试从数据库中对两个表执行连接。有了ef,我可以做
\u context.Problem.Include(x=>x.Solved.ToList()
,但我没有使用ef,因此,我复杂地尝试使用两个独立的
List
LINQ to对象来执行类似的操作,就像EF一样支持join-您可以使用
join
或在查询语法中
join
等于
..
to
。感谢我不知道Enumerable.join。ToHashSet()也是一个好主意。@jah LINQ to objects几乎具有LINQ to数据库等的所有功能;它还可以使用查询语法和流畅语法。
var problemIDs = MethodToCallDbAndGenerateList()
                    .Where(x => x.Property1 == "value")
                    .Select(p => p.ProblemId)
                    .ToHashSet();