2017-09-21 17 views
1

こんにちは私は以下のようにダイナミックテーブルを作成しました。同じIDを持つ2行を持っています どのようにマージしますか?ダイナミックテーブルの2行をマージする必要があります

DataTable dt = new DataTable(); 
dt = (DataTable)Session["AddtoCart"]; 
DataRow dr1 = dt.NewRow(); 
foreach (var key in collection.AllKeys) 
{ 
    dr1["Description"] = collection["hdDescription"]; 
    dr1["Title"] = collection["hdTitle"]; 
    dr1["ActualQuantity"] = collection["hdactualquantity"]; 
    dr1["PropertyId"] = collection["hdPropertyId"]; 
    dr1["Quantity"] = collection["Quantity"]; 
    TempData["AddedtoCart"] = ConfigurationManager.AppSettings["AddtoCart"].ToString(); 
} 
dt.Rows.Add(dr1); 

私は私が必要な

Propertyid, Quantity, ActualQuantity 
1    5   10 
1    2   10 
2    3   20 
2    4   20 

Thの結果は

Propertyid, Quantity, ActualQuantity 
1    7   10 
2    7   20 

として更新あるよう行があり、コメントを追加しました:私はthis answerを試してみました:

var query = dt.AsEnumerable() 
    .GroupBy(row => row.Field<int>("PropertyId"))// issue over this line 
    .Select(grp => new 
    { 
     PropertyId = grp.Key, 
     Quantity = grp.Sum(row => row.Field<int>("Quantity")), 
     ActualQuantity = grp.First().Field<int>("ActualQuantity"), 
     Title = grp.First().Field<int>("Title"), 
     Description = grp.First().Field<int>("Description") 
    }); 

var SumByIdTable = dt.Clone(); 
foreach (var x in query) 
    SumByIdTable.Rows.Add(x.PropertyId, x.Quantity, x.ActualQuantity,x.Title, x.Description); 

Session["AddtoCart"] = SumByIdTable; 

ただし、指定されたキャストは有効ではないという問題が発生しています。 .GroupBy上(行=> row.Field( "PropertyId"))

アップデート2:私はコードの下に試してみましたが、私は問題

DataTable dt = new DataTable(); 
dt.Columns.Add("PropertyId", typeof(int)); 
dt.Columns.Add("Quantity", typeof(int)); 
dt.Columns.Add("Description", Type.GetType("System.String")); 
dt.Columns.Add("Title", Type.GetType("System.String")); 
dt.Columns.Add("ActualQuantity", typeof(int)); 
DataRow dr1 = dt.NewRow(); 
foreach (var key in collection.AllKeys) 
{ 
    dr1["Description"] = collection["hdDescription"]; 
    dr1["Title"] = collection["hdTitle"]; 
    dr1["ActualQuantity"] = Convert.ToInt32(collection["hdactualquantity"]); 
    dr1["PropertyId"] = Convert.ToInt32(collection["hdPropertyId"]); 
    dr1["Quantity"] = Convert.ToInt32(collection["Quantity"]); 
    TempData["AddedtoCart"] = ConfigurationManager.AppSettings["AddtoCart"].ToString(); 
} 
dt.Rows.Add(dr1); 

var query = dt.AsEnumerable() 
    .GroupBy(row => row.Field<int>("PropertyId")) 
    .Select(grp => new 
    { 
     PropertyId = grp.Key, 
     Quantity = grp.Sum(row => row.Field<int>("Quantity")), 
     ActualQuantity = grp.First().Field<int>("ActualQuantity"), 
     Title = grp.First().Field<string>("Title"), 
     Description = grp.First().Field<string>("Description") 
    }); 

var SumByIdTable = dt.Clone(); 
foreach (var x in query) 
    SumByIdTable.Rows.Add(x.PropertyId, x.Quantity, x.ActualQuantity,x.Title, x.Description); 

Session["AddtoCart"] = SumByIdTable; 

を取得していますが、私は

で問題を取得しています

SumByIdTable.Rows.Add(x.PropertyId, x.Quantity, x.ActualQuantity,x.Title, x.Description);

入力文字列が正しい形式ではありませんでした。

アップデート3は解決済み:私はコードの下にしようとしていると

DataTable dt = new DataTable(); 
dt.Columns.Add("PropertyId", typeof(int)); 
dt.Columns.Add("Quantity", typeof(int)); 
dt.Columns.Add("Description", Type.GetType("System.String")); 
dt.Columns.Add("Title", Type.GetType("System.String")); 
dt.Columns.Add("ActualQuantity", typeof(int)); 
DataRow dr1 = dt.NewRow(); 
foreach (var key in collection.AllKeys) 
{ 
    dr1["Description"] = collection["hdDescription"]; 
    dr1["Title"] = collection["hdTitle"]; 
    dr1["ActualQuantity"] = Convert.ToInt32(collection["hdactualquantity"]); 
    dr1["PropertyId"] = Convert.ToInt32(collection["hdPropertyId"]); 
    dr1["Quantity"] = Convert.ToInt32(collection["Quantity"]); 
    TempData["AddedtoCart"] = ConfigurationManager.AppSettings["AddtoCart"].ToString(); 
} 
dt.Rows.Add(dr1); 

var query = dt.AsEnumerable() 
    .GroupBy(row => row.Field<int>("PropertyId")) 
    .Select(grp => new 
    { 
     PropertyId = grp.Key, 
     Quantity = grp.Sum(row => row.Field<int>("Quantity")), 
     ActualQuantity = grp.First().Field<int>("ActualQuantity"), 
     Title = grp.First().Field<string>("Title"), 
     Description = grp.First().Field<string>("Description") 
    }); 

var SumByIdTable = dt.Clone(); 
foreach (var x in query) 
    SumByIdTable.Rows.Add(Convert.ToInt32(x.PropertyId), Convert.ToInt32(x.Quantity), x.Description, x.Title, Convert.ToInt32(x.ActualQuantity)); 

Session["AddtoCart"] = SumByIdTable; 

変更を働いている私はDTに設定クローンとしてSumByIdTableに値を追加する必要がありました

あなたは、LINQを使用することができます

答えて

2

( - データテーブル):

var query = dt.AsEnumerable() 
    .GroupBy(row => row.Field<int>("Propertyid")) 
    .Select(grp => new { 
     Propertyid  = grp.Key, 
     Quantity  = grp.Sum(row => row.Field<int>("Quantity")), 
     ActualQuantity = grp.First().Field<int>("ActualQuantity")  
    }); 

var SumByIdTable = dt.Clone(); 
foreach(var x in query) 
    SumByIdTable.Rows.Add(x.Propertyid, x.Quantity, x.ActualQuantity); 
+0

最後に、このテーブルをセッション["AddtoCart"] = dtに追加する必要があります。その場合、私はSession ["AddtoCart"] = SumByIdTableとして追加する必要があります。正しい –

+0

はい、またはそれを他の変数にアサインします。dt = SumByIdTable; –

+0

問題を取得してください更新された質問 –

関連する問題