2017-09-14 95 views
0

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

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; 
} 
+0

你为什么叫'FirstOrDefault()。FirstOrDefault()'? – maccettura

+0

为什么不把整个'user.Posts.GroupBy(后=> post.Topic.ID) .OrderByDescending(后=> post.Count()) .FirstOrDefault() .FirstOrDefault() .Topic'部分在一个方法里面?然后执行'TopicName = NewMethod()。Name','TopicAlias = NewMethod().Alias'等。 – Sach

+0

@maccettura:因为GroupBy返回IEnumerable > - 我想从第一个最大的组获得第一个元素。这相当于针对特定用户的帖子数量最多的主题。有点奇怪,但我不知道如何写得更干净。 – user132435465

回答

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

然后从返回的结果就可以构造你的对象

+0

这正是我想要的。谢谢。 – user132435465