我正在尝试评估这样的表达式:
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}
我该如何解决这个问题?
答案 0 :(得分:0)
答案 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并适当调整索引。