0

我正在处理一个 MVC4 项目,我需要通过比较两个列表来创建一个新的对象列表。db下面指的是DbContext对象。

在我工作的项目中,我需要比较两个列表。第一个是一个学期提供的所有科目。另一个有学生选择的科目。

List<Subject> subjects = db.Subjects;
//...
List<Subject> semesterSubjects = student.Subjects;

在这两个列表中,我需要创建一个项目列表,说明是否每个项目都被选中。它看起来像这样。

class SubjectSelection
{
public int ID { get; set; }
public String Title { get; set; }
public bool IsSelected { get; set; }
}

我现在需要的是比较subjects&semesterSubjects并得到一个IEnumerable<SubjectSelection>

我可以使用 Linq 来获得这样的结果吗?如何获得?

4

2 回答 2

2

最好的方法是在服务器端完成这项工作。从您的学期科目中选择 ID:

var selectedIDs = semesterSubjects.Select(s => s.ID).ToList();

并将它们传递给查询:

var query = db.Subjects.Select(s => new SubjectSelection()
                     {
                        ID = s.ID,
                        Title = s.Title,
                        IsSelected = selectedIDs.Contains(s.ID)
                     });

如果您使用相同的数据库上下文实例来检索学期科目列表和科目列表,那么您可以简单地使用:

var query = subjects.Select(s => new SubjectSelection()
                     {
                        ID = s.ID,
                        Title = s.Title,
                        IsSelected = semesterSubjects.Contains(s)
                     });

实体框架实现了身份映射模式,这意味着它返回相同的主题对象的内存实例,该实例由不同的查询返回。

于 2012-12-13T10:05:56.210 回答
0
var allSubjectsWithSelection = subjects.Select(o=>new SubjectSelection(){ID = o.ID,Title = o.Title, IsSelected = semesterSubjects.Any(s=>s.ID == o.ID)}).ToList();
于 2012-12-13T10:06:15.967 回答