【发布时间】:2014-05-25 23:58:34
【问题描述】:
我正在尝试编写一些允许自定义表达式存储在字符串中以针对各种数据进行评估的东西。经过几次失败的尝试后,我找到了一些成功的东西,但它并不符合意图。
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 test = dt.AsEnumerable().AsQueryable();
// An example of an expression to test
string expression = "Age = 32";
// Failed Attempts
//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'"}
//var result3 = test.Where("Age=@0", 32); // Error received: {"No property or field 'Age' exists in type 'DataRow'"}
//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'"}
//var result6 = test.Where("it[\"Age\"] as Age = 127"); // Error received: {"Expression of type 'Boolean' expected"}
// Successful but at this point its not really a dynamic linq expression
var result = test.Where(it => it.Field<int>("Age") == 32);
我怎样才能做到这一点?条条大路似乎都回到了这篇文章:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx 但我看不到我正在尝试做的事情的答案,因为他正在使用强类型数据。
谢谢!
【问题讨论】:
-
不是
linq,而是DataTable.Select()方法有用吗? -
我从未尝试过将 Dynamic Linq 与 DataTable 一起使用。我想知道您是否会考虑不使用 DataTable 的选项?
-
这会起作用:dt.Select("Age=32");这也可以: dt.AsEnumerable().Where(a => a["Name"].Equals("John"));
-
DaveParsons 和 Arie 对,但现在我有点困惑。为什么 Select("Age=32") 有效而 Where("Age=32") 无效?我只使用了 Where to begin with,因为我认为它是用于过滤的?
-
@jrandomuser 它们是查询
DataTable的完全不相关的方法。一个特定于DataTable,并且已经存在了更长的时间。另一个是 LINQ,它不仅特定于数据表,而且具有非常不同的查询方法。
标签: c# linq dynamic-linq