使用 Linq 对 4 个表进行分组

Grouping 4 Tables using Linq

我有以下要求:

这是我目前拥有的:

from rating in Ratings
where rating.LocationID == 1007
    join ratingpicture in RatingPictures
    on rating.ID equals ratingpicture.RatingID into j3
    from ratingpicture in j3.DefaultIfEmpty()
        join comment in Comments
        on rating.ID equals comment.RatingID into j1
        from comment in j1.DefaultIfEmpty()
            join user in Users
            on comment.UserID equals user.ID into j2
            from user in j2.DefaultIfEmpty()
group new { ratingpicture, comment, user } by rating into g
select new { rating = g.Key, ratingpicture= g.Key, comment = g.ToList() }

如果您像这样为您的实体建模 类:

public class Comment
{
    public int CommentId { get; set; }
    public int RatingId { get; set; }
    public virtual Rating Rating { get; set; }

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

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

}

public class Rating
{
    public Rating()
    {
        RatingPictures = new HashSet<RatingPicture>();
        Comments = new HashSet<Comment>();
    }

    public int RatingId { get; set; }
    public virtual ICollection<RatingPicture> RatingPictures { get; set; }
    public virtual ICollection<Comment> Comments { get; set; }
    public int LocationID { get; set; }
}

public class RatingPicture
{
    public int RatingPictureId { get; set; }
    public int RatingId { get; set; }
    public virtual Rating Rating { get; set; }

}

那么您的查询就这么简单:

var query = context.Ratings.Where(r => r.LocationID == 1007)
    .Include(r => r.RatingPictures)
    .Include(r => r.Comments.Select(c => c.User));

var result = query.ToList();

在幕后,这个查询将被翻译成一个连接查询。但这就是 ORM 的美妙之处,我们可以在更抽象的层面上工作。

查看 this reference 了解有关 Entity Framework 中的关系和导航属性的更多信息。