C# 使用DataTable.Compute在

C# 使用DataTable.Compute在,c#,sql,tsql,c#-4.0,datatable,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 {

我试图计算这样一个表达式:

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}
如何解决这个问题?

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

表达式参数需要聚合函数

看起来您必须对其使用一个聚合函数


还可以查看以下文档:

语法是:

dt.Compute(expression, filter);
表达式
需要是一个聚合函数,如Sum、Count或Average

过滤器
部分设置与表达式一起使用的字段。如果您的列被称为
colTest
,并且字段应该包含
Test
,那么您的过滤器将是:
colTest==“Test”

编辑

据我所知,您有一个专栏,如果某个字段包含“Test”,您希望在其中更改内容

我编写了这个快速模型来演示如何在没有
dt.Compute()

DataTable=newdatatable();
表.列.添加(“id”,类型(int));
表.列.添加(“测试”,类型(字符串));
表.Columns.Add(“ValueToChange”,typeof(string));
表.行.添加(1,“1”);
表.行.添加(2,“0”);
表.行.添加(3,“1”);
表.行.添加(4,“0”);
表.行.添加(5,“1”);
//选择列测试为“1”的所有行
var rows=table.AsEnumerable()。其中(t=>t.Field(“Test”)==“1”);
foreach(变量x在行中)
{
//将字段值设置为“更改”
x、 设置字段(“值更改”、“更改”);
//linqpad输出。忽略它
x、 Dump();
}

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

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

var result=dt.AsEnumerable()
.Sum(d=>d.Field(“Test”)==“Test”?1:0);

您可以执行类似的操作:

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并适当调整索引。

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


请尝试此操作。

:“表达式参数需要聚合函数”。您没有指定聚合。此外,您可以将其简化为
dt.Compute(“SUM(1)”,“'Test'='Test'”)
,您根本不需要一个case语句。@GarethD我需要一个case语句,因为我需要这样的
case当'Test'='Test'然后2+3,否则5+5结束
,无论是谁降级了所有答案,分享你的不喜欢,这样我们都可以学习…除非你只是在这里玩!我认为这不是正确的答案-
dt.Compute(“1=1”,“1”)
工作得非常好。这里没有聚合函数。甚至
dt.Compute(“'Test'='Test'””)
也能工作。哇,这看起来比我的解决方案更优雅。是的@Serv,使用LINQ很容易。我使用LINQ,但我有点谨慎,因为Sum函数在字符串列上触发,并用整数值替换它。@Serv,Sum函数在这里不是在字符串上触发的。根据字符串值,它可以添加1或0,两者都是整数。
var result = dt.AsEnumerable()
               .Sum(d=>d.Field<string>("Test") == "Test"? 1:0);
foreach (DataRow r in dt.Rows) // Loop over the rows
{
    if (some condition)
       dt.Rows[r]["yourTargetColumnName"]=true;
    else
       dt.Rows[r]["yourTargetColumnName"]=false;
}