我试图找出如何在这两个类上定义代码的第一个导航属性,以执行与此查询类似的操作:
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);
答案 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可以在不进行连接的情况下管理大多数类型的查询。