2012-02-08 6 views
2

私はlinqを使い慣れました。 C#では、次のようにして1列のカウントを取得しています。linqのgroup by節を使用してテーブル列のカウントを計算する方法

SELECT DispatcherName, 
     ActivityType, 
     CONVERT(BIGINT,COUNT(ActivityType)) AS Total 
FROM  ACTIVITYLOG 
GROUP BY DispatcherName, 
     ActivityType 
ORDER BY Total DESC 

LINQを使用して同じことを達成する方法を教えてください。

更新日:

こんにちは、私は以下のようにして再開しました。 しかし、私は結果をdatatableに変換できません。 これは私のやり方です。 ここでは、dtはDispatchernameとActivityTypeの2つの列を持つデータ型です。

var query1 = from p in dt.AsEnumerable() 
          group p by new 
          { 
           DispatcherName = p.Field<string>("Dispatchername"), 
           Activity = p.Field<string>("ActivityType"), 
          } 
           into pgroup 
           let count = pgroup.Count() 
           orderby count 
           select new 
           { 
            Count = count, 
            DispatcherName = pgroup.Key.DispatcherName, 
            Activity = pgroup.Key.Activity 
           }; 

plsできるだけ早く助けてください。

+0

http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b私はあなたが考えて作るものがまず第一に、これは「トリックを行う」になると思ういけない –

答えて

1

結果をDataTableに戻す場合は、CopyToDataTableメソッドを使用します。

ここでは実際の例です:http://rextester.com/XHX48973

この方法は、基本的にそのNewRowメソッドを使用するために、ダミーのテーブルを作成する必要があります - のDataRowを作成するための唯一の方法は、CopyToDataTableによって必要とされます。

var result = dt.AsEnumerable() 
    .GroupBy(p => new { 
      DispatcherName = p.Field<string>("DispatcherName"), 
      Activity = p.Field<string>("ActivityType")}) 
    .Select(p => { 
     var row = dummy.NewRow(); 
     row["Activity"] = p.Key.Activity; 
     row["DispatcherName"] = p.Key.DispatcherName; 
     row["Count"] = p.Count(); 
     return row; 
    }) 
    .CopyToDataTable(); 

おそらくより良い方法はただList<T>に変換してForEachを使用することにより、直接行に記入される可能性があります。

DataTable dummy = new DataTable(); 
dummy.Columns.Add("DispatcherName",typeof(string)); 
dummy.Columns.Add("Activity",typeof(string)); 
dummy.Columns.Add("Count",typeof(int)); 

dt.AsEnumerable() 
    .GroupBy(p => new { DispatcherName = p.Field<string>("DispatcherName"), 
     Activity = p.Field<string>("ActivityType")}) 
    .ToList() 
    .ForEach(p => { 
     var row = dummy.NewRow(); 
     row["Activity"] = p.Key.Activity; 
     row["DispatcherName"] = p.Key.DispatcherName; 
     row["Count"] = p.Count(); 
     dummy.Rows.Add(row); 
    }); 

ライブ例:http://rextester.com/TFZNEO48009

+0

ありがとうございました。あなたはカウントの降順で結果を並べ替える方法を教えてもらえますか? – Ram

+0

@Ramここに行くhttp://msdn.microsoft.com/en-us/library/bb546145.aspx –

0

これはトリックを行う必要があります。

IList<ACTIVITYLOG> allActivityLogs; 
      var result = (from c in allActivityLogs 
          select new 
          { 
           DispatcherName = c.DispatcherName, 
           ActivityType = c.ActivityType, 
           Total = c.ActivityType.Count 
          }).OrderByDescending(x => x.Total) 
         .GroupBy(x => new { x.DispatcherName, x.ActivityType }); 

あなただけのエンティティの実際のコレクションをallActivityLogsコレクションを代用する必要があります。

+1

彼の 'ActivityType'プロパティは' Count'ですか? – Jamiec

5
from c in ACTIVITYLOG 
group c by new {c.DispatcherName, c.ActivityType} into g 
orderby g.Count() descending 
select new { g.Key.DispatcherName, g.Key.ActivityType, Total = g.Count() } 
+1

優雅です。 +1私はまだLINQを学んでおり、この文脈では "新しい"キーワードの使用は素晴らしいです。 + woot –

関連する問題