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 ビジュアライザーでデバッグ中に確認できます。
DataTable は、データ入力に使用される DataViewGrid にバインドされます。
助けが必要。
[編集]これについてさらにデバッグと調査を行いました。詳細を共有します。DataTable には 3 つの行があります。myDataTable.Select() を実行すると、3 行が表示されます。フィルター式を使用せずに .Compute を呼び出して列の値を合計すると、適切な結果が得られます。しかし、3行目をフィルタリング(.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 日編集] この問題が再び発生しました。以下の 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);