C#动态LINQ查询DataTable无结果,语法问题求助
C#动态LINQ查询DataTable无结果,语法问题求助
兄弟,我太懂你这种明明数据就在表里,动态LINQ却查不出结果的憋屈了!问题出在你写的查询语法上——DataRow的列不是它的直接属性,动态LINQ里不能像普通对象那样直接写列名,得对应普通LINQ里的Field方法调用才行。
你看你原来的查询条件写的是"City == \"Seattle\"",但DataRow本身没有叫City的公共属性,普通LINQ里我们是用s.Field<string>("City")来获取列值的,动态LINQ里也得遵循这个逻辑,把条件改成调用Field方法的形式。
给你修正一下代码:
// 注意这里要改用Field方法来指定列名 string WhereClause = "Field(\"City\") == \"Seattle\""; var dynamicQuery = SelRecsTable.AsEnumerable().AsQueryable().Where(WhereClause).ToList(); MessageBox.Show("Total List Recs: " + dynamicQuery.Count.ToString());
要是以后需要多条件组合查询也一样,比如要同时匹配城市和年龄(假设Age是整数列),就这么写:
string WhereClause = "Field(\"City\") == \"Seattle\" && Field(\"Age\") > 30";
这里还要提醒你一个细节:如果是数值、日期这类强类型的列,动态LINQ里不用给值加引号,直接写原始类型就行;如果是字符串类型,记得要加双引号转义,就像你之前做的那样。
举个普通LINQ和动态LINQ的对应关系更清楚:
- 普通LINQ:
dt.AsEnumerable().Where(s => s.Field<string>("City") == "Seattle") - 动态LINQ对应写法:
"Field(\"City\") == \"Seattle\""
这样改完之后,你再跑代码应该就能正确查出那8条Seattle的记录了!
内容来源于stack exchange
相关产品推荐
相关产品推荐

