C# 使用LINQ根据数据表计算字符串中的表达式

C# 使用LINQ根据数据表计算字符串中的表达式,c#,linq,dynamic-linq,C#,Linq,Dynamic Linq,我正在尝试写一些东西,允许自定义表达式存储在字符串中,以便对各种数据进行求值。经过几次失败的尝试,我终于找到了一些成功的东西,但它并不符合我的意图 DataTable dt=newdatatable(); 添加(新数据列(“名称”,类型(字符串)); 添加(新数据列(“年龄”,类型(int)); Add(新对象[]{“John”,32}); var test=dt.AsEnumerable().AsQueryable(); //要测试的表达式的示例 字符串表达式=“年龄=32”; //失败的尝试

我正在尝试写一些东西,允许自定义表达式存储在字符串中,以便对各种数据进行求值。经过几次失败的尝试,我终于找到了一些成功的东西,但它并不符合我的意图

DataTable dt=newdatatable();
添加(新数据列(“名称”,类型(字符串));
添加(新数据列(“年龄”,类型(int));
Add(新对象[]{“John”,32});
var test=dt.AsEnumerable().AsQueryable();
//要测试的表达式的示例
字符串表达式=“年龄=32”;
//失败的尝试
//var result1=test.Where(表达式);//收到错误:{“类型“DataRow”中不存在属性或字段“Age”}
//var result2=test.Where(“it.Field(\“Age\”)==32”);//收到错误:{“类型“DataRow”中不存在属性或字段“field”}
//var result3=test.Where(“年龄=@0,32);//收到错误:{“类型“DataRow”中不存在属性或字段“Age”}
//var result4=test.Where(“it[\“Age\”]==127”);//收到错误:{“运算符”=='与操作数类型“Object”和“Int32”不兼容}
//var result5=test.Where(“it[\“Age\”]=127”);//收到错误:{“运算符”='与操作数类型“Object”和“Int32”不兼容}
//var result6=test.Where(“it[\“Age\”]as Age=127”);//收到错误:{“应为'Boolean'类型的表达式”}
//成功,但在这一点上,它并不是一个真正的动态linq表达式
var result=test.Where(it=>it.Field(“年龄”)==32);
我怎样才能做到这一点?所有的路似乎都通向这篇文章:但我看不到我试图做什么的答案,因为他使用的是强类型数据


谢谢

这应该能帮你找到你想要的东西。如果没有与提供的字符串名称匹配的列,请进行空检查

int age = 32;
string column = "Age";

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Name", typeof(string)));
dt.Columns.Add(new DataColumn("Age", typeof(int)));

dt.Rows.Add(new object[] { "John", 32 });

var result = dt.AsEnumerable().Where(r => Convert.ToInt32(r[column]) == age);

如果您想使用DynamicIQ,您需要更改代码

1) 这句话

// Failed Attempts
string expression = "Age = 32";
var result1 = test.Where(expression); // Error received:  {"No property or field 'Age' exists in type 'DataRow'"}
var result2 = test.Where("it.Field<object>(\"Age\") == 32");  // Error received:  {"No property or field 'Field' exists in type 'DataRow'"}
是一样的

// Failed Attempts
var result1 = test.Where("Age = 32"); // Error received:  {"No property or field 'Age' exists in type 'DataRow'"}
因此,DynamicIQ尝试为DataRow查找属性
Age
,因为DataRow类没有此属性,所以会出现错误类型“DataRow”中不存在属性或字段“Age”


2) 在这个表达式中

// Failed Attempts
string expression = "Age = 32";
var result1 = test.Where(expression); // Error received:  {"No property or field 'Age' exists in type 'DataRow'"}
var result2 = test.Where("it.Field<object>(\"Age\") == 32");  // Error received:  {"No property or field 'Field' exists in type 'DataRow'"}

下两个表达式等效,因为当DynamicLink解析表达式时,它将
=
=
解析为
等于

var result4 = test.Where("it[\"Age\"] == 127"); // Error received:  {"Operator '==' incompatible with operand types 'Object' and 'Int32'"}
var result5 = test.Where("it[\"Age\"] = 127");  // Error received:  {"Operator '=' incompatible with operand types 'Object' and 'Int32'"}
如果您看到about属性,您可以看到它返回
对象
,因此要检查等于,您需要将对象结果强制转换为
int
类似的内容

var result4 = test.Where("Convert.ToInt32(it[\"Age\"]) == 127");
var result4 = test.Where("it[\"Age\"] == @0",127);
另外,在这种情况下,您可能可以像这样帮助参数化表单

var result4 = test.Where("Convert.ToInt32(it[\"Age\"]) == 127");
var result4 = test.Where("it[\"Age\"] == @0",127);

终于来了

var result6 = test.Where("it[\"Age\"] as Age  = 127");  // Error received:  {"Expression of type 'Boolean' expected"}

解析表达式dynamicLink后,获取不返回
Boolean
的lambda,因此您会得到错误表达式,该表达式的类型应为“Boolean”

,这不是
linq
,但该方法会有帮助吗?我从未尝试将DynamicLinq与数据表一起使用。我想知道你是否会考虑一个不使用DATABATE的选项?这将起作用:DT。选择(“年龄=32”);这也会起作用:dt.AsEnumerable(),其中(a=>a[“Name”].Equals(“John”);达维帕森和艾瑞是的,但现在我有点困惑。为什么选择(“年龄=32”)有效,而在哪里(“年龄=32”)不起作用?我只使用Where开头,因为我认为它是用于过滤?@jrandomuser它们是完全不相关的查询
数据表的方法。一个是特定于
DataTable
的,并且已经存在很久了。另一个是LINQ,它不仅特定于数据表,而且具有非常不同的查询方法。