2014-11-22 54 views
1

我有3个表 - 发布,评论,赞
评论已连接到帖子由TypeId和PostType,喜欢连接到帖子和评论TypeId和类型,喜欢有一列LikeType,其中0表示喜欢,1分表示不喜欢

现在我想张贴有列表和两者都应该包含各自的顶和踩LINQ查询与组连接和计数需要重构

var post = (from c in Db.Comments 
       where c.Type == Model.PostType.Post.ToString() 
       group c by c.TypeId 
       into com 
       join p in Db.Posts on com.Key equals p.Pid 
       where p.Pid == postId 
       select new 
       { 
        Post = p, 
        Comments = com.Select(c=>new{Comment=c,like =Db.Likes.Count(
            l => l.TypeId==c.CommentId&&l.Type==Model.PostType.Comment.ToString()&&l.LikeType==(int)Model.LikeType.Like) 
        ,dislike =Db.Likes.Count(
            l => l.TypeId==c.CommentId&&l.Type==Model.PostType.Comment.ToString()&&l.LikeType==(int)Model.LikeType.Dislike)}), 
        Likes = Db.Likes.Count(l => l.TypeId == p.Pid && l.Type == Model.PostType.Post.ToString() && l.LikeType == (int)Model.LikeType.Like), 
        Dislikes = Db.Likes.Count(l => l.TypeId == p.Pid && l.Type == Model.PostType.Post.ToString() && l.LikeType == (int)Model.LikeType.Dislike), 
       }).FirstOrDefault(); 

我得到的结果,但生成的查询好像是大的,所以我如何优化。

回答

0

帮助方法:

int LikeCount(DbLikes likes, int typeId, int type, int likeType) 
{ 
    return likes.Count(like => 
    like.TypeId == typeId && 
    like.Type == type && 
    like.LikeType == likeType); 
} 

帮助变量:

var commentType = Model.PostType.Comment.ToString(); 
var postType = Model.PostType.Post.ToString(); 
var likeType = (int)Model.LikeType.Like; 
var dislikeType = (int)Model.LikeType.Dislike; 

目标查询:

var post = (
    from c in Db.Comments 
    where c.Type == postType 
    group c by c.TypeId into com 
    join p in Db.Posts on com.Key equals p.Pid 
    where p.Pid == postId 
    select new 
    { 
    Post = p, 
    Comments = com.Select(c => new 
     { 
     Comment = c, 
     like = LikeCount(Db.Likes, c.CommentId, commentType, likeType), 
     dislike = LikeCount(Db.Likes, c.CommentId, commentType, dislikeType) 
     }), 
    Likes = LikeCount(Db.Likes, p.Pid, postType, likeType), 
    Dislikes = LikeCount(Db.Likes, p.Pid, postType, dislikeType), 
    }).FirstOrDefault();