具有多个 where 子句的 Linq to Datatable
Posted
技术标签:
【中文标题】具有多个 where 子句的 Linq to Datatable【英文标题】:Linq to Datatable with multiple where clauses 【发布时间】:2013-09-13 10:09:12 【问题描述】:情况: Linq 查询到具有多个 where 子句的数据表。 where 子句的过滤器来自多个 ComboBox,例如 account、year、month 等。 查询结果将保存到不同的数据表中。
我有不同的查询,例如...
//Filter Year
var query = from myRow in ds.Tables["tblOriginal"].AsEnumerable()
where myRow.Field<DateTime>("Datum").Year == int.Parse(cmbFilterYear.Text)
select myRow;
ds.Tables["tblFilteredData"].Merge(query.CopyToDataTable());
...我有大约六个这样的 Linq 查询,我想在一个查询中使用不同的 where 子句使用
...&&...
如果所有 ComboBox 都填充有值,它就可以工作。
但是如果例如6 个 ComboBox 中只有 4 个填充了值。
是否有可能将“IF...”放入查询的“where”块中?
我已经尝试使用 stringbuilder 为 where 子句设置变量,但无法将其转换为正确的布尔值。
任何想法都值得赞赏。
【问题讨论】:
【参考方案1】:改用方法语法。它允许您逐步构建查询:
var query = ds.Tables["tblOriginal"].AsEnumerable();
int year;
if (Int32.TryParse(cmbFilterYear.Text, out year)) // condition for adding filter
query = query.Where(r => r.Field<DateTime>("Datum").Year == year);
// repear for other conditions
ds.Tables["tblFilteredData"].Merge(query.CopyToDataTable()); // execute query
【讨论】:
【参考方案2】:如果你不想使用方法语法方式(如@lazyberezovsky所示),你可以尝试如下:
//Filter Year
var query = from myRow in ds.Tables["tblOriginal"].AsEnumerable()
where (string.IsNullOrEmpty(cmb1.Text) || myRow.Field<DateTime>("Datum").Year == int.Parse(cmb1.Text))
&& (string.IsNullOrEmpty(cmb2.Text) || myRow.Field<DateTime>("Datum").Year == int.Parse(cmb2.Text))
&& (string.IsNullOrEmpty(cmb3.Text) || myRow.Field<DateTime>("Datum").Year == int.Parse(cmb3.Text))
select myRow;
ds.Tables["tblFilteredData"].Merge(query.CopyToDataTable());
这里,string.IsNullOrEmpty(cmb1.Text)
是您的非价值条件。如果空虚不是您的案例的正确非价值条件,请将其替换为您需要的任何套件。
【讨论】:
以上是关于具有多个 where 子句的 Linq to Datatable的主要内容,如果未能解决你的问题,请参考以下文章
Linq-to-Entities:带有 WHERE 子句和投影的 LEFT OUTER JOIN
Linq to Entities 中的动态 where 子句 (OR)