Linq - 加入身份证的地方!=,选择新的+不同的?

时间:2015-09-21 23:32:36

标签: c# linq

我有以下课程。

场;

 public class Course
{
    //pk
    public int Id{ get; set; }
    public int SourceCourseId { get; set; }
    public string Name { get; set; }
}

注册

public class Registration
{
    //primary key
    public int Id { get; set; }
    //...more fields
    public int CourseId { get; set; }
}

我想获取一组匿名对象,其中包含以下两个字段,用于注册表中不在Courses表中的所有课程。

var distinctCourses = (from registration in db.Registrations
                       join courses in db.Courses on registration.CourseId equals courses.SourceCourseId
                       where registration.CourseId != courses.SourceCourseId
                       select new
                            {
                                SourceCourseId = registration.CourseId,
                                Name = registration.CourseName,

                            }).Distinct().ToList();

出于某种原因,上面的回报是0 ......有什么建议吗?

2 个答案:

答案 0 :(得分:2)

尝试左连接:

var query = from r in registrations
join c in courses on r.CourseId equals c.id into newCourses
from nullCourse in newCourses.DefaultIfEmpty()
where nullCourse == null
select new { }

编辑 - 来自Alex的评论: 此外,您的where子句需要更改为

where nullCourse == null

编辑 - 更改了连接列并添加了正确的where子句。

编辑 - 在CourseID上进行组注册,使它们不同

var distinctCourses = 
    (from registration in db.Registrations 
     group registration by registration.CourseId into grp
     from reg in grp
     join courses in db.Courses on reg.CourseId equals courses.SourceCourseId into newCourses
     from nullCourse in newCourses.DefaultIfEmpty()
     where nullCourse == null
     select new
     {
        SourceCourseId = reg.CourseId,
        Name = reg.CourseName,

     }).ToList();

答案 1 :(得分:0)

试试这个

var result = Registrations.GroupJoin(Courses,r=>r.CourseId,c=>c.SourceCourseId,
                            (k,g) => new {k,g})
                            .Where(x=>x.g.Count()==0)
                            .Select(s=> new {id=s.k.CourseId,name=s.k.CourseName});