1

我正在尝试对 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);
4

1 回答 1

0

在 .Compute 上方添加以下代码行后,问题得到解决。

(this.DataSource as BindingSource).EndEdit();

显然,网格单元(此处的作业类型列)中的数据未提交到底层数据源。EndEdit 成功了。

于 2015-06-16T09:14:56.410 回答