1

次のようなデータを返すクエリがあります。

Event | Sum | Date 
sent  | 400 | 1/1/12 
open  | 200 | 1/1/12
click | 50  | 1/1/12 
sent  | 300 | 1/8/12
open  | 150 | 1/8/12
click | 30  | 1/8/12

SQL クエリ:

select event, sum(thecount), rundate
from send_open_click_counts
group by event, rundate
order by rundate, event desc 

これらの値を Google ビジュアライゼーション API に送信してグラフをレンダリングするには、値を次のように配置する必要があります。

['date' , 'sent' , 'opened' , 'clicked']
['1/1/12', '400' , '200' , '50']
['1/8/12', '300', '150' , '30']

私はこのことにあまり詳しくありませんが、私にとっては日付によってピボットされています。

元のSQLをシミュレートするために使用したlinqクエリは次のとおりです

    var dbLinqObj= from r in db.SEND_OPEN_CLICK_COUNTS
                group r by new { r.EVENT, r.RUNDATE } into g
                select new {
                    EVENT = g.Key.EVENT,
                    THECOUNT = g.Sum(r => r.THECOUNT),
                    RUNDATE = g.Key.RUNDATE

                } ;
    dbLinqObj= dbLinqObj.OrderBy(r => r.RUNDATE);

====編集====解決策が見つかりました=====

これをさらに掘り下げ、コメントからいくつかの提案を得た後、LINQ を使用したエレガントなソリューションを見つけました。

JSON 文字列に簡単に変換できるように、結果を適切にピボットする LINQ を次に示します。

        var query = from q in db.SEND_OPEN_CLICK_COUNTS
                    group q by q.RUNDATE  into g
                    select new
      {
          Date = g.Key,
          Send = g.Where(x => x.EVENT == "sent").Sum(x => x.THECOUNT),
          Open = g.Where(x => x.EVENT == "opened").Sum(x => x.THECOUNT),
          Click = g.Where(x => x.EVENT == "clicked").Sum(x => x.THECOUNT)
      };
4

1 に答える 1

0

使用した linq ピボットは、配列に変換する代わりに、Aggregatelinq メソッドを使用して JSON を構築することができる一般的な方法です。

例えば:

var dbLinqObj= from r in db.SEND_OPEN_CLICK_COUNTS
            group r by new { r.EVENT, r.RUNDATE } into g
            select new {
                EVENT = g.Key.EVENT,
                THECOUNT = g.Sum(r => r.THECOUNT),
                RUNDATE = g.Key.RUNDATE

            } ;
var dbLinqObjJSON = dbLinqObj.OrderBy(r => r.RUNDATE).Aggregate((json, x) => json + "['" + x.RUNDATE + ", "'" + x.THECOUNT + "', '" + ...  + "]";

Aggregateは StringBuilder を使用しないため、大きなシーケンスではパフォーマンスが低下することに注意してください。JSONを作成するString代わりに使用しているため、これは現在、投稿されたコードの問題です。.NET ランタイムで演算子StringBuilderを使用するたびに、新しい文字列を作成する必要があります。+String

できるだけ速くしたい場合は、Aggregate のオーバーライドがありStringBuilderます。

var dbLinqObjJSON = dbLinqObj.OrderBy(r => r.RUNDATE).Aggregate(new StringBuilder("['date' , 'sent' , 'opened' , 'clicked'] , "),
                         (json, x) => json.append("['" + x.RUNDATE + "', '" + x.THECOUNT + "', '" + ...  + "], "),
                         (json) => json.ToString());
于 2012-07-09T20:33:30.263 に答える