我正在尝试在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,用于dataentry。
需要帮助。
[编辑]我做了一些进一步的调试和研究。分享细节。 DataTable中有3行。 当我运行myDataTable.Select()时,我得到3行。当我调用.Compute来对没有过滤器表达式的列值求和时,它会给出正确的结果。 但是当我尝试过滤(。选择)第3行时,我得到0行。如果我尝试过滤前两行,它们的效果非常好。顺便提一下,第三行正在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的问题。
[编辑22/2013年8月]仍在努力获得一个体面的解决方案。请帮忙。
[编辑16/2014年7月]再次遇到这个问题。下面的Datatable Compute方法给出了错误的答案。
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);
答案 0 :(得分:0)
在上面添加以下代码行后,问题得到修复.Compute。
(this.DataSource as BindingSource).EndEdit();
显然,网格单元格中的数据(此处为jobtype列)未提交给基础数据源。 EndEdit做了这个伎俩。