Linq到Datatable有多个where子句

时间:2013-09-13 10:09:12

标签: c# linq

情况: 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子句设置变量,但我无法将其转换为适当的布尔值。

任何想法都表示赞赏。

2 个答案:

答案 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)是您的非价值条件。如果空白不适合您的情况,请将其替换为您需要的任何套件。