使用GroupBy方法

时间:2017-09-14 22:08:52

标签: c# entity-framework linq

有没有机会简化此查询?我正在使用实体框架,当他们看到这种DRY违规时,我的眼睛在哭。数据库有一些典型的论坛项目表:用户,帖子,主题,类别 - 所有这些都是合适的导航属性。

GetMostActiveTopicByUserID为特定用户返回最活跃的主题(最活跃的=所有用户主题中发送最多的帖子)。

ActiveTopicDTO GetMostActiveTopicByUserID(int id)
{
    var result = _databaseContext.Users.Where(q => q.ID == id)
    .Select(user => new UserMostActiveTopicDTO()
    {
        TopicName = user.Posts.GroupBy(post => post.Topic.ID)
                    .OrderByDescending(post => post.Count())
                    .FirstOrDefault()
                    .FirstOrDefault()
                    .Topic.Name,

        TopicAlias = user.Posts.GroupBy(post => post.Topic.ID)
                    .OrderByDescending(post => post.Count())
                    .FirstOrDefault()
                    .FirstOrDefault()
                    .Topic.Alias,

        TopicCategoryDescription = user.Posts.GroupBy(post => post.Topic.ID)
                    .OrderByDescending(post => post.Count())
                    .FirstOrDefault()
                    .FirstOrDefault()
                    .Topic.Description

        //and so on...
    }).Single();

    return result;
}

1 个答案:

答案 0 :(得分:1)

您完全分组是基于Topic.ID然后您不需要一次又一次分组。请进行一次分组并返回如下结果,

CHANGE_TYPE_TO_TYPE_OF_RETURN-TYPE GetMostActiveTopicByUserID(int id)
{
    return _databaseContext.Users
        .Where(q => q.ID == id)
        .Select(user => 
        {
            user.Posts.GroupBy(post => post.Topic.ID)
                .OrderByDescending(post => post.Count())
                .FirstOrDefault()
        })
        .Single();
}

然后从返回的结果中构建对象