2

情况:Linq 查询具有多个 where 子句的数据表。where 子句的过滤器来自多个 ComboBox,如帐户、年份、月份等。查询的结果将保存到不同的数据表中。

我有不同的查询,例如...

        //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 子句设置变量,但我无法将其转换为正确的布尔值。

任何想法都值得赞赏。

4

2 回答 2

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
于 2013-09-13T10:12:45.717 回答
1

如果您不想使用方法语法方式(如@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)是您的非价值条件。如果空性不是您的案例的正确非价值条件,请将其替换为您需要的任何套件。

于 2013-09-13T10:29:27.350 回答