使用Compute函数对Datatable列求和,但不进行筛选。

4

当我添加一个项目进行筛选时,似乎可以正常工作,但是我不想添加筛选器,即仅希望对该列求和。

我尝试传入string.empty和"",但没有成功:

object objColTotal;
objColTotal = _dataSetDataTable.Compute("Sum(Price)", "");
decimal tot = Convert.ToDecimal(objColTotal);
2个回答

5

一个空字符串应该可以使用。

您始终可以使用您确定会包含所有记录的筛选器。


在十进制列上进行快速测试:

var dt = new DataTable();
dt.Columns.Add("DecCol1", typeof(decimal));
dt.Columns.Add("StrCol1");
dt.Rows.Add(new object[] { 1.1, "r1"});
dt.Rows.Add(new object[] { 2.2, "r2" });
dt.Rows.Add(new object[] { 3.3, "r3" });

object sum = dt.Compute("SUM(DecCol1)", "");
Console.WriteLine(sum);

我得到了正确的答案:6.6


该列的数据类型为十进制。我想知道这是否会导致问题或者是否有一种处理方法? - Dkong
@Dkong 我不这么认为;我进行了快速测试,它对我有效。 - Jay Riggs
感谢您的帮助,Jay。我以为自己要疯了,因为它一直返回零,但实际上是在一个包含负数和正数值的长列中,这些值相加得到了零。 - Dkong
@Dkong 每个人都需要定期进行一次合理性检查。很高兴能够帮忙。 - Jay Riggs

0

注意两件事情

  • 如果你的列名有空格,你必须使用括号,单引号或双引号是不被接受的。
  • 还要注意,Compute返回一个对象,将其向上转换为某些东西(int)会出错,你必须使用其他方法,如下面的示例

示例:

int Dones = int.Parse(dt.Compute("sum(Done)", "").ToString());
int InProgresss = int.Parse(dt.Compute("sum([In Progress])", "").ToString())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接