1

我试图找出如何在这两个类上定义代码优先导航属性以执行与此查询类似的操作:

SELECT USERID, FIRSTNAME, LASTNAME, COURSEID, NAME
FROM User
LEFT OUTER JOIN Course ON User.USERID = Course.USERID
WHERE COURSEID = 1

因此,我正在尝试查找用户列表以及他们是否参加过某门课程。

public class User
{
    public int UserId {get;set; }

    public string FirstName {get;set;}

    public string LastName {get;set;}

    public virtual ICollection<Course> Courses { get; set; }
}

public class Course 
{
    public int CourseId { get;set; }

    public int UserId { get;set; }

    public string Name { get;set; }

    public virtual User User {get;set;}
}

如果我要编写一个查询来实现这一点

var u = Users.Where(x => x.Courses.Any(x => x.CourseId = 1));

这做了一个子查询,这不是我想要的(因为没有参加课程的人不会显示)。

如何定义导航属性?

HasMany(t => t.Courses).WithOptional(t => t.User).HasForeignKey(t => t.UserId);
4

2 回答 2

0

检查此链接:

http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx

LINQ 中的左外连接是通过 DefaultIfEmpty 方法完成的。

于 2013-09-12T05:20:32.983 回答
0
 var u = Users.Select ( x => new {
        User = x,
        AttendedCourse = x.Courses.Any()
 } );

对于特定的课程 ID,

var u = Users.Select ( x => new {
        User = x,
        AttendedCourse = x.Courses.Any( c => c.CourseID == 1 )
 } );

子查询是编写相关查询的唯一方法,但是,EF 会选择最合适的连接类型并给您正确的结果。EF 可以管理几乎所有类型的查询,而无需进行连接。

于 2013-09-12T07:51:57.250 回答