2016-06-27 11 views
0

キーワードは「条件付き」です。linqを使用してデータベースから複数の列を条件付きでグループ化する方法は?

私は次のDataTableを持っている:金額の合計と同じ日に移転のプレミアムと法戻されるタイプの支払いのために 、ディスプレイ1つのレコード:

Date Type    Method Amount SerialNumber TransId Info 
1/1/11 Misc    Check 50.00 5412   1000  NA 
1/1/11 Misc    Check 25.00 5413   1001  ABC 
1/2/11 Pymt    Fee  15.00 5476   1002  CD 
1/3/11 Returned Premium Transfer 20.00 6741   1105  D 
1/3/11 Returned Premium Transfer 35.00 7456   1106  S 

基準は、次のように述べてい。タイプ、方法、TransId、シリアル番号は最初の支払いから表示され、Info列は空白のままにしてください。彼らは同じ日付、種類、およびメソッドを持っている場合、私は以下のLINQを試してみましたが、その希望グループALL支払い

Date Type    Method Amount SerialNumber TransId Info 
1/1/11 Misc    Check 50.00 5412   1000  NA 
1/1/11 Misc    Check 25.00 5413   1001  ABC 
1/2/11 Pymt    Fee  15.00 5476   1002  CD 
1/3/11 Returned Premium Transfer 55.00 6741   1105   

は、ここに私が必要とする出力です。同じDate、Type = Return Premium、およびMethod = Transferを持つレコードをグループ化するだけです。

var dt = tbl.AsEnumerable() 
         .GroupBy(row => new 
         { 
          Date = row.Field<DateTime>("Date"), 
          TranType = row.Field<string>("Type"), 
          TranMethod = row.Field<string>("Method") 
         }).Select(g => g.CopyToDataTable()).FirstOrDefault(); 

入力はDataTableのであり、出力は私がcopyingToDataTableだ理由です、DataTableにする必要があります。

+0

特定の日付に単一の「返品プレミアム」、「譲渡」がある場合はどうすればよいですか? –

+0

すべてのレコードは、タイプ=返品プレミアム、メソッド=転送、およびこれら2つのレコードが同じ日付を持つ場合を除いて、個々のレコードとして扱う必要があります。 – Pavel

+0

なぜデータセットを条件に基づいて2つに分割し、その条件を持つアイテムをグループ化して、その結果を1つのデータテーブルに入れるのはなぜですか? –

答えて

0

テーブルを変更しています.LINQはデータを照会するためのものです。 LINQを使用して、更新が必要なものを検索して変更を加えることはできますが、それらは別々に行う必要があります。

グループ化する必要がある項目を検索し、それらを置き換えるために新しい行を作成してグループ化します。

var query = 
    from row in table.AsEnumerable() 
    let date = row.Field<DateTime>("Date") 
    let type = row.Field<string>("Type") 
    let method = row.Field<string>("Method") 
    let transId = row.Field<int>("TransId") 
    where type == "Returned Premium" 
    where method == "Transfer" 
    orderby date, transId // assuming transactions are ordered by TransId 
    group row by date; 
foreach (var g in query) 
{ 
    var newRow = table.Rows.Add(g.First().ItemArray); 
    newRow.SetField("Amount", g.Sum(r => r.Field<decimal>("Amount"))); 
    foreach (var r in g) 
     r.Delete(); 
} 
関連する問題