使用LINQ的特定列的总和

时间:2013-01-24 11:14:10

标签: c# linq

使用下面提到的查询,我得到一个名为的列的所有值 promotionValue 。我想获得* 匹配*

的所有值的总和
var matched = from table1 in dvtempPropertyRoomRatePromotion.ToTable().AsEnumerable()
              join table2 in dvPropertyRooms.ToTable().AsEnumerable() on
              table1.Field<DateTime>("RateDate") equals table2.Field<DateTime>("RateDate")
            where table1.Field<DateTime>("RateDate") == table2.Field<DateTime>("RateDate")
               select table1.Field<string>("promotionValue");

3 个答案:

答案 0 :(得分:4)

您需要parse字符串intdecimal

var matched = from r1 in dvtempPropertyRoomRatePromotion.ToTable().AsEnumerable()
              join r2 in dvPropertyRooms.ToTable().AsEnumerable() 
              on r1.Field<DateTime>("RateDate").Date equals r2.Field<DateTime>("RateDate").Date
              select decimal.Parse(r1.Field<string>("promotionValue"));
decimal sum = matched.Sum();

请注意,我还更改了其他一些内容,例如冗余where(因为您已加入这些表格)或Date DateTime属性。

除此之外

  1. 为什么你需要DataViewToTable始终会创建一个新的DataTable。为什么不为所有人使用Linq-To-DataSet?我假设您已使用DataView进行过滤,请改用Enumerable.Where。这将更加一致,更有效,更具可读性。
  2. 为什么列promotionValue是一个字符串?您应该将其存储为数字类型。

答案 1 :(得分:0)

这里我对不同表的两列的总和进行简单查询。

选择       res.Date       ,res.Cost       ,res.Cost + res_con.Cost         来自[ExpenseMst] res         内部联接[ExpenseMst_2] res_con on res_con.ID = res.ID

日期|费用1 |费用2 |总

2014-03-04 | 5200 | 5200 | 10400

2014-03-04 | 5012 | 5012 | 10024

2014-03-22 | 100 | 100 | 200

2014-03-13 | 25 | 25 | 50

2014-02-22 | 120 | 120 | 240

我希望它有用.. :)

答案 2 :(得分:-2)

你可以做到

int sum = 0;
foreach(int match in matched)
{
  sum = sum + match;
}