具有多个 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 entity 没有生成 where 子句

Linq to Entities 中的动态 where 子句 (OR)

linq to sql select和where的区别

LINQ to SQL查询中的C#Dynamic WHERE子句

在Linq-to-SQL中使用WHERE子句时出错