使用DataTable.Compute来评估Case何时

时间:2013-10-21 10:21:53

标签: c# sql tsql c#-4.0 datatable

我正在尝试评估这样的表达式:

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}

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:0)

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

  

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

看起来你必须使用其中一个聚合函数。

另请查看DataColumn.Expression

答案 1 :(得分:0)

您可以对lambda表达式使用linq查询。例如(假设你需要总和);

var result = dt.AsEnumerable()
               .Sum(d=>d.Field<string>("Test") == "Test"? 1:0);

答案 2 :(得分:0)

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

试试看。

答案 3 :(得分:-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();
}

这可能不是您的情景,但您可以通过几个快速步骤进行调整。

答案 4 :(得分:-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并适当调整索引。