【发布时间】:2013-08-17 15:40:27
【问题描述】:
我正在尝试对 DataTable 列进行条件 SUM。下面的代码没有给我正确的结果。
var d = Convert.ToDouble(myDataTable.Compute("SUM(qty_o)", "itemmaster1_id=4636 AND batch=15789")) // returns 0
myDataTable.Select("itemmaster1_id=4636 AND batch=15789") // return 0 rows
“myDataTable”有一条满足过滤条件“itemmaster1_id=4636 AND batch=15789”的记录,我可以在 DataTable Visualizer 中调试时看到它。
DataTable 绑定到用于数据输入的 DataViewGrid。
需要帮助。
[编辑] 我对此做了一些进一步的调试和研究。分享细节。 DataTable 中有 3 行。 当我运行 myDataTable.Select() 时,我得到 3 行。当我调用 .Compute 对没有过滤器表达式的列值求和时,它会给出正确的结果。 但是当我尝试过滤(.Select)第三行时,我得到 0 行。如果我尝试过滤前 2 行,它们工作得很好。顺便说一下,第 3 行正在输入 DataGridView。因此,可能是有问题的数据行(第 3 行)未提交或其他原因。但是,我正在做所有必要的事情来将数据持久化/提交到数据源/数据表中,这可以通过 .Select() 调用和 .Compute("SUM(qty_o)", null) 调用返回正确的结果来证明。我很困惑。
我也碰巧看到了这个开放的错误 - http://connect.microsoft.com/VisualStudio/feedback/details/477331/filter-expression-in-datatable-compute-datatable-select-failed 和这个 - http://support.microsoft.com/kb/891742/en-us。我祈祷这对于 .NET 4.0 来说不是问题。
[2013 年 8 月 22 日编辑] 仍在努力寻找体面的解决方法。请帮忙。
[2014 年 7 月 16 日编辑] 再次遇到此问题。下面的数据表计算方法给了我错误的答案。
double d = Convert.ToDouble(this.DataSourceAsDataTable.Compute("SUM(amount)", "jobtype=1"));
虽然下面的 LINQ 查询完美地给出了正确的答案。
double n = this.DataSourceAsDataTable
.AsEnumerable()
.Where(r => ((r["jobtype"] != DBNull.Value) ? Convert.ToInt32(r["jobtype"]) : 0) == 1)
.Sum(r => (r["amount"] != DBNull.Value) ? Convert.ToDouble(r["amount"]) : 0);
【问题讨论】:
-
像this solution?这样的查询格式怎么样
-
id和batch列是数字还是字符串?
-
我只知道
Compute(string expression, string filter),您的示例是否完全编译?究竟是哪种方法? -
@Jonesy:在我的情况下,无法使用您的建议,因为计算的公式表达式和过滤器表达式来自数据库。
-
@HenkHolterman:id 和批处理列是数字的。我已经修复了代码(编译问题)。这段代码不是直接取自我的程序,而是为这个问题再次编写的,因此错过了。
标签: c# .net datatable system.data