如何使用导航属性使用Entity Framework执行左外连接

时间:2013-09-12 03:52:39

标签: entity-framework

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

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);

2 个答案:

答案 0 :(得分:0)

检查此链接:

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

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

答案 1 :(得分:0)

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

具体课程编号,

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

子查询是编写相关查询的唯一方法,但EF会选择最合适的连接类型并为您提供正确的结果。 EF可以在不进行连接的情况下管理大多数类型的查询。