使用Linq对4个表进行分组

时间:2015-11-27 21:45:39

标签: c# linq join linq-group

我有以下要求:

  • 一个评级可以有零个或多个RatingPictures
  • 一个评级可以有零个或多个评论
  • 一个评论属于一个用户

enter image description here

这是我到目前为止所做的:

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() }

1 个答案:

答案 0 :(得分:1)

如果你对这样的实体类进行建模:

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中关系和导航属性的更多信息。