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;
}
你为什么叫'FirstOrDefault()。FirstOrDefault()'? – maccettura
为什么不把整个'user.Posts.GroupBy(后=> post.Topic.ID) .OrderByDescending(后=> post.Count()) .FirstOrDefault() .FirstOrDefault() .Topic'部分在一个方法里面?然后执行'TopicName = NewMethod()。Name','TopicAlias = NewMethod().Alias'等。 – Sach
@maccettura:因为GroupBy返回IEnumerable> - 我想从第一个最大的组获得第一个元素。这相当于针对特定用户的帖子数量最多的主题。有点奇怪,但我不知道如何写得更干净。 –
user132435465