このクエリを簡略化する可能性はありますか? Entity Frameworkを使用していて、この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()を構築することができ、1つのグループを行うと、以下のような結果を返してください。FirstOrDefault()'? – maccettura
なぜ全体ではなく 'user.Posts.GroupBy(ポスト=> post.Topic.ID) .OrderByDescending(ポスト=> post.Count())を入れ .FirstOrDefault() .FirstOrDefault() .Topic'一部メソッドの内部?次に、 'TopicName = NewMethod()。Name'、' TopicAlias = NewMethod()。Alias'などを実行します。 – Sach
@Galcettura:GroupByはIEnumerableを返すので - 最初の要素を最初の最大のグループから取得します。これは、特定のユーザーの投稿数が最も多いトピックに相当します。少し奇妙ですが、私はそれをもっときれいに書く方法は考えていません。 –
user132435465