LINQ を使用して、リモートの共有ポイント Web サービスから返された JSON オブジェクトを処理しています。オンラインで見つけた回答のほとんどが、私が必要としていたものとわずかに異なっていたため、これを投稿しました。
毎日のアクティビティの json リストがリモートの共有ポイント リストから返され、LINQ を使用して要約されます
カスタム オブジェクト定義の簡易版を以下に示します ( & は MVC アプリケーションのモデル領域で定義されています)。
public class MyCustomObjectList
{
public string eventdate { get; set; }
public string userid { get; set; }
public string action { get; set; }
}
JSON オブジェクトは MyCustomObjectList 配列にシリアライズされます。
var customobject = serializer.Deserialize<MyCustomObjectList>(jsonobject);
特定の日に発生した各タイプのアクションの数を計算したかったのです。注意: eventdate は、yyyy-mm-dd hh:MM:ss 形式の文字列として保存されます。これは、c#、JSON、および Jquery 間の変換を簡素化するためでした (必要に応じて、eventdate を使用してコード内の別の場所に DateTime オブジェクトを作成します。
これは非効率的であると主張する人もいますが、デバッグを容易にし、他の人が私のコードに従うのを助けるために、プロセスを一連の非常に単純な操作の連続セットに分割することを好みます。そのため、2 つの Linq クエリがあります。
querya は eventdate から時間コンポーネントを取り除きます。これにより、後のグループ化が秒単位ではなく日単位で行われることが保証されます。キャッシュがないことを二重に確認するために、actionday という新しいフィールドに作成します。インテリセンスが混乱していたので、アクションの名前もアクティビティに変更しました!! 他の列はそのままコピーされます。
var querya =
from c in customobject.rows
select new { actionday = c.eventdate.Substring(0, 10), activity = c.action, c.userid,
c.eventdate };
/* queryb は、actionday と activity でグループ化された querya のグループ化されたカウントを生成し、新しい列 actionkey,ActionCount,Dte,action & DetailList を作成します (これはデバッグ目的の要約です) */
var queryb=
from p in querya group p by new { p.actionday, p.activity} into idGroup
actionkey = idGroup.Key,
ActionCount = idGroup.Count(),
Dte = idGroup.Key.actionday,
action = idGroup.Key.activity,
DetailList = idGroup
};
これは、3列で要約するバージョンです
var queryc = from p in querya
group p by new { p.actionday, p.userid, p.activity} into idGroup
select new
{
actionday = idGroup.Key,
ActionCount = idGroup.Count(),
userid = idGroup.Key.userid,
Dte = idGroup.Key.actionday,
action = idGroup.Key.activity,
DetailList = idGroup
};