合并两个LINQ查询

3

我正在尝试合并两个LINQ查询,但是结果并不符合我的期望。

List<TeacherSubjectVM> query = (from t in uow.staffs
                                join ts in uow.teachersubjects on t.ID equals ts.teacherID
                                join s in uow.subjects on ts.subjectID equals s.ID
                                select new TeacherSubjectVM
                                {
                                    subjectName = s.Name,
                                    teacherName = t.fname,
                                }).ToList();

List<TeacherSubjectVM> query1 = (from t in uow.subjects
                                 join ts in uow.classsubjects on t.ID equals ts.subjectID
                                 join s in uow.jamats on ts.subjectID equals s.ID
                                 select new TeacherSubjectVM
                                 {
                                     section = s.section,
                                     className = s.name,
                                 }).ToList();

List<TeacherSubjectVM> combine = query.Concat(query1).ToList();

课程名称和班级应该与教师名称在同一行:


你需要进行单个查询,将所有表连接起来,而不是两个分开的查询,每个查询只包含部分信息。它正在按照你告诉它的方式执行:将两个仅有两个字段的列表连接在一起。 - Ian Mercer
2个回答

1

只需在一步中加入您想要连接的所有表:

List<TeacherSubjectVM> query = (from t in uow.staffs
                            join ts in uow.teachersubjects on t.ID equals ts.teacherID
                            join s in uow.subjects on ts.subjectID equals s.ID
                            join cs in uow.classsubjects on ts.subjectID equals cs.ID
                            join j in uow.jamats on ts.subjectID equals j.ID
                            select new TeacherSubjectVM
                            {
                                subjectName = s.Name,
                                teacherName = t.fname,
                                section = cs.section,
                                className = j.name,
                             }).ToList();

我认为这就是你想做的,但是你不一致的变量命名和变量名重复使用使得阅读起来非常困难。


@Umair,我认为这就是你要找的答案。 - akasoggybunz

0
你所采取的方法无法达到预期效果,因为Concat函数不会合并对象,它只会将query1中的所有项附加到query中形成一个新列表,即combine
实现你的目标的方法是循环遍历它们并手动合并对象,类似以下代码:
List<TeacherSubjectVM> query = (from t in uow.staffs
                                join ts in uow.teachersubjects on t.ID equals ts.teacherID
                                join s in uow.subjects on ts.subjectID equals s.ID
                                select new TeacherSubjectVM
                                {
                                    Id = ts.subjectID,
                                    subjectName = s.Name,
                                    teacherName = t.fname,
                                }).ToList();

List<TeacherSubjectVM> query1 = (from t in uow.subjects
                                 join ts in uow.classsubjects on t.ID equals ts.subjectID
                                 join s in uow.jamats on ts.subjectID equals s.ID
                                 select new TeacherSubjectVM
                                 {
                                     Id = ts.subjectID,
                                     section = s.section,
                                     className = s.name,
                                 }).ToList();

query.ForEach(item => {
    var otherItem = query1.Where(itm => itm.Id == item.Id).FirstOrDefault();

    item.subjectName = otherItem?.subjectName;
    item.teacherName = otherItem?.teacherName;
});

请注意,我已将Id属性添加到TeacherSubjectVM类中,以便可以根据它进行合并,应填充学科ID,因为这是两个对象之间唯一的共同点。
PS:使用描述性变量名称始终是更好的实践,这将有助于提高代码的可读性和可维护性 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接