【问题标题】:Linq Comparing Two Lists and Generating a New OneLinq 比较两个列表并生成一个新列表
【发布时间】:2012-12-13 10:01:40
【问题描述】:

我正在处理一个 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&lt;SubjectSelection&gt;

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

【问题讨论】:

  • 紫妍,看我更新的答案

标签: c# linq


【解决方案1】:

最好的方法是在服务器端完成这项工作。从您的学期科目中选择 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)
                     });

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

【讨论】:

  • 我更新了解决方案,因为只有当您选择的主题从相同的上下文中加载时,才可以按对象平等搜索,如所有主题列表。
  • 谢谢,它看起来像工作!你回答得这么快,我怀疑你到底是不是懒惰;)
【解决方案2】:
var allSubjectsWithSelection = subjects.Select(o=>new SubjectSelection(){ID = o.ID,Title = o.Title, IsSelected = semesterSubjects.Any(s=>s.ID == o.ID)}).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 2014-05-16
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多