2017-02-24 15 views
0

を取る:LINQのグループによって、カウント

table data

上記の表のデータの挿入は、このように動作します: - 我々は今、2つのステータスを持っている(1、2)。 エントリが作成されると、ステータスが1で、IDが1のユーザに割り当てられます。 データが更新されると、ステータスは2になり、複数のユーザに割り当てられます。私は次のように、データがステータスによってグループ化させたいユーザー2と3に

が割り当てられている: -

Result

各IDが唯一つだけの状態の下に含まれるべき、各ステータス更新の最新の日付に基づいて行われる必要があります。 これはlinq c#ではどのように可能ですか?

以下は私が達成できるものです。

var result = (from el in this.logRepository.GetQuery(null) 
        group el by el.statusinto grp 
        select new 
        { ID = grp.Key, Count = grp.Count()}).ToList(); 
+0

だから、基本的に各ユーザーのすべてのエントリを取得し、ステータス別にグループ化し、各ステータスのユーザーをカウントします。右? – Tatranskymedved

+2

間違いなく**可能**、あなた自身を最初に試してください –

+0

少しコードを教えてくださいできますか? –

答えて

1

あなたの条件

によると、各IDには、唯一つだけの状態の下に含まれるべきであり、それはあなたが最初に必要な各ステータスの更新

の最新の日付に基づいて取られるべきですIdでグループ、Statusにより各グループから最新の日付を持つ要素を取り、その後、グループ結果:

var query = 
    from e in (from e in this.logRepository.GetQuery(null) 
       group e by e.Id into g 
       select g.OrderByDescending(e => e.Date).FirstOrDefault()) 
    group e by e.Status into g 
    select new { Status = g.Key, Count = g.Count() }; 

または代わりに

0

GroupByメソッドを使用して、必要な機能を利用できます。

GroupBy(foo => foo.Bar)は、キーがfoo.Barの値であるディクショナリになり、ディクショナリの各エントリの値は、foo.Barの値に一致するもののコレクションになります。

関連する問題