假设我有3张桌子:
[Table("Comments")]
public class Comment {
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("Users")]
public int UserId { get; set; }
public virtual Users Users { get; set; }
public string Text { get; set; }
}
[Table("Users")]
public class Users {
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string UserName { get; set; }
}
[Table("CommentAgree")]
public class CommentAgree {
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int CommentId { get; set; }
public int UserId { get; set; }
}
用户发表评论和其他用户可以“同意”该评论,有点像Facebook的“喜欢”系统。我正在使用lambda进行查询,我可以这样做:
var query = db.Comments.Select(c => new {
c.Id,
c.Users.UserName,
c.Text
});
如何在Comment.Id = CommentAgree.CommentId
上创建与CommentAgree的联接?我可以在Lambda中编写连接但我需要它是一个左连接,因为没有人可能同意评论,但我仍然希望它显示。
我想以正确的方式做到这一点,所以我愿意建议是否通过外键,lambda连接,导航属性......或其他方式来做到这一点?
这可能吗?
由于
答案 0 :(得分:1)
最好的方法可能是使用Entity Framework的功能并创建导航属性,而不是显式使用LINQ来执行仅用于相关数据的连接。
如果您的类型仅仅是为了数据访问的目的,那么在关系的两端添加导航属性可能是一个好主意,以及您已经拥有的外键属性。
Comment
上的集合导航属性应该实现ICollection
(例如List<CommentAgree>
),并且{{1}上将有Comment
类型的引用导航属性输入。
然后,您必须使用数据注释或(最好)流畅的API定义映射中的关系。
要加载相关数据,您可以使用延迟加载或预先加载(使用CommentAgree
扩展方法),也可以使用实体的条目信息中的显式加载。