1

Datatable次の SQL クエリに相当する LINQ 命令は何ですか?

SELECT code_direction, count(TP) AS CN 
FROM table1 
WHERE cod_time = 'A011' 
GROUP BY TP,code_direction;

結果を新しいデータテーブルに取得する方法は?

変換しようとしましたが、いくつかのエラーがあります。誰かがこれを見ることができます:

    var query = from t in table1.AsEnumerable()
                group t by new { t.TP, t.code_direction }
                    into grp
                    select new
                    {
                        grp.Key.code_direction,
                        CN = grp.Count(t.TP)
                    };
    foreach (var x in query)
    {
        Console.Write(x.code_direction);
        Console.Write(x.CN);
    }
4

2 に答える 2

1

最初の質問に関する限り。SQL クエリに相当する LINQ は次のとおりです。

var query = from t in table1.AsEnumerable()
            where t.cod_time == "A011"
            group t by new { t.TP, t.code_direction }
                into grp
                select new
                {
                    grp.Key.code_direction,
                    CN = grp.Count()
                };

に引数を渡す必要はないことに注意してくださいgrp.Count()。(SQL では COUNT(TP) が COUNT(*) と同じであるという明らかな理由から、つまり行数をカウントするだけです。COUNT(DISTINCT TP) などを使用する場合、話は異なります。)

2 番目の質問に関する限り、クエリIEnumerable<T>が T の場所DataRow(つまり、 のようなクエリ) を返すだけの場合は、拡張メソッドのみを使用table1.AsEnumerable().Where(r => r.cod_time == "A011")できます。DataTableExtensions.CopyToDataTableただし、クエリは匿名型を返すため、MSDNにある次の手順に従う必要があります。

于 2011-12-20T09:32:57.293 に答える
0

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
};
于 2012-05-29T14:56:01.087 に答える