1

次のような式を評価しようとしています。

DataTable dt = new DataTable();
dt.Compute("Case When 'Test'='Test' Then 1 Else 0 End", "")

しかし、次のエラーが表示されます。

'dt.Compute("Case When 'Test'='Test' Then 1 Else 0 End", "")' threw an exception of type 'System.Data.SyntaxErrorException' object {System.Data.SyntaxErrorException}

どうすればこれを解決できますか?

4

5 に答える 5

0

DataTable.Compute method takes expression as a first parameter and takes filter as a second.

The expression parameter requires an aggregate function.

Looks like you must use one of aggregate functions on it.

Also take a look DataColumn.Expression

于 2013-10-21T10:30:17.127 に答える
0

ラムダ式でlinqクエリを使用できます。例(Sumが必要だと仮定);

var result = dt.AsEnumerable()
               .Sum(d=>d.Field<string>("Test") == "Test"? 1:0);
于 2013-10-21T10:48:06.967 に答える
-1

これに似たことができます:

foreach (DataRow r in dt.Rows) // Loop over the rows
{
    if (some condition)
       dt.Rows[r]["yourTargetColumnName"]=true;
    else
       dt.Rows[r]["yourTargetColumnName"]=false;
}

上記のコードは、テスト条件に基づいてターゲット列を true または false に設定します。目的が特定の行に対処することである場合は、foreach を削除し、インデックスを適切に調整します。

于 2013-10-21T11:09:36.003 に答える
-1

ここにあるドキュメントから: http://msdn.microsoft.com/de-de/library/system.data.datatable.compute(v=vs.80).aspx

構文は次のとおりです。

dt.Compute(expression, filter);

Sum、Count、Average などのexpression集計関数である必要があります。

このfilter部分は、式で使用されるフィールドを設定します。列が呼び出され、フィールドにフィルターをcolTest含める必要がある場合は、次のようになります。TestcolTest == 'Test'

編集

私が理解していることから、特定のフィールドに「テスト」が含まれている場合、コンテンツを変更したい列があります。

私はこの簡単なモックアップを書いて、それをなしで達成する方法を示しました。dt.Compute()

DataTable table = new DataTable();
table.Columns.Add("id", typeof(int));
table.Columns.Add("Test", typeof(string));
table.Columns.Add("ValueToChange", typeof(string));

table.Rows.Add(1, "1");
table.Rows.Add(2, "0");
table.Rows.Add(3, "1");
table.Rows.Add(4, "0");
table.Rows.Add(5, "1");

//Select all Rows in which the column Test is "1"
var rows = table.AsEnumerable().Where (t => t.Field<string>("Test") == "1");
foreach (var x in rows)
{
    //set the field ValueToChange to "changed"
    x.SetField("ValueToChange", "changed");
    //linqpad output. ignore it
    x.Dump();
}

これはあなたのシナリオとは異なるかもしれませんが、いくつかの簡単な手順で適応させることができます。

于 2013-10-21T10:30:59.317 に答える