情况: Linq查询到具有多个where子句的数据表。 where子句的过滤器来自几个组合框,如帐户,年,月等。 查询结果将保存到不同的数据表中。
我有不同的查询,例如......
//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个填充了值。
是否有可能放置&#34; IF ...&#34;进入&#34;查询&#34; -block?
我已经尝试使用stringbuilder为where子句设置变量,但我无法将其转换为适当的布尔值。
任何想法都表示赞赏。
答案 0 :(得分:4)
请改用方法语法。它允许您逐步构建查询:
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
答案 1 :(得分:0)
如果您不想使用方法语法方式(如@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)
是您的非价值条件。如果空白不适合您的情况,请将其替换为您需要的任何套件。