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

您可以使用带有 lambda 表达式的 linq 查询。例如(假设您需要 Sum);

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

DataTable.Compute方法将表达式作为第一个参数,将过滤器作为第二个参数。

表达式参数需要一个聚合函数。

看起来您必须在其上使用聚合函数之一。

也来看看DataColumn.Expression

于 2013-10-21T10:30:17.127 回答
0

DataTable dt = new DataTable(); dt.Compute("IIF('Test'='Test',1,0)", "")

试试这个。

于 2020-11-21T14:32:22.023 回答
-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);

expression需要是一个聚合函数,如 Sum、Count 或 Average 。

filter部分设置与表达式一起使用的字段。如果您的列被调用colTest并且该字段应包含Test您的过滤器,则为:colTest == '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 回答