C# DataTable计算并选择给出错误结果的方法
我正在尝试对DataTable列进行条件求和。下面的代码没有给我正确的结果C# DataTable计算并选择给出错误结果的方法,c#,.net,datatable,system.data,C#,.net,Datatable,System.data,我正在尝试对DataTable列进行条件求和。下面的代码没有给我正确的结果 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”有一条满足筛选条件“
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和batch=15789”的记录,我可以在DataTable Visualizer中调试时看到它
DataTable绑定到用于数据输入的DataViewGrid
我需要帮助
[编辑]我对此做了进一步的调试和研究。分享细节。
数据表中有3行。
当我运行myDataTable.Select()时,我得到3行。当我调用.Compute对不带过滤器表达式的列值求和时,它会给出正确的结果。
但当我尝试筛选(.Select)第三行时,得到0行。如果我尝试过滤前两行,它们工作得非常好。顺便提一下,第三行正在DataGridView中输入。因此,可能是有问题的数据行(第三行)未提交或其他原因。但是,我正在做所有必要的工作来将数据持久化/提交到datasource/datatable中,这可以通过.Select()调用和.Compute(“SUM(qty_o)”,null)调用返回正确的结果来证明。我很困惑
我还碰巧看到了这个打开的bug,还有这个。我祈祷这不是.NET4.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);
在添加了位于.Compute上方的代码行后,问题得到了解决
(this.DataSource as BindingSource).EndEdit();
显然,网格单元(此处的jobtype列)中的数据没有提交到底层数据源。EndEdit做到了这一点。如何格式化查询,例如id和批处理列是数字还是字符串?我只知道
Compute(字符串表达式、字符串过滤器)
,您的示例是否编译过?具体是哪种方法?@Jonesy:无法使用您的建议,因为在我的例子中,计算的公式表达式和筛选表达式来自数据库。@HenkHolterman:id和batch列是数字列。我已经修复了代码(编译问题)。这段代码不是直接从我的程序中提取的,而是为这个问题再次编写的,因此错过了。