寻找构建 Linq 动态/条件表达式的简单方法
本文关键字:表达式 简单 方法 条件 构建 Linq 动态 寻找 | 更新日期: 2023-09-27 18:30:47
给定表为:
表1
- 编号
- 字符串字段1
- 字符串字段2
- 字符串字段3
- 字符串字段4
表2
- 编号
- table1_id
- 字符串字段1
- 日期字段1
给定一个 UI 允许用户对以下内容进行有效查询:
- dropdwonlist1 包含 any 和 table1.stringfield1 值
- dropdwonlist2 包含 any 和 table1.stringfield2 值
- dropdwonlist3 与 any 和 table1.stringfield3 值
- dropdwonlist4 与 any 和 table1.stringfield4 值
- dropdwonlist5 与 any 和 table2.stringfield1 值
- dropdwonlist6 with [any, the, before, after, between]
- 日历 1 与表2.日期字段 1 链接
- 日历 2 与表2链接。日期字段1
结果是数据网格视图与每个字段。
我想构建条件查询,就好像不是"任何"添加此条件一样。
考虑到这一点,简单的 LINQ 查询不适用:
Table2
.Where(x => x.stringfield1 == dropdwonlist1.SelectedValue)
.Where(x => x.stringfield2 == dropdwonlist2.SelectedValue)
.Where(x => x.stringfield3 == dropdwonlist3.SelectedValue)
(...)
文档中有表达式树,但这看起来太多了。
有没有最简单的方法来构建我的动态查询?
表达式树看起来比实际更可怕,但你是对的,在你的情况下它们是不必要的:你可以使用一个足够聪明的静态条件来忽略没有选择的下拉列表。你可以这样做:
Table2
.Where(x => dropdwonlist1.SelectedValue == null || x.stringfield1 == dropdwonlist1.SelectedValue)
.Where(x => dropdwonlist2.SelectedValue == null || x.stringfield2 == dropdwonlist2.SelectedValue)
.Where(x => dropdwonlist3.SelectedValue == null || x.stringfield3 == dropdwonlist3.SelectedValue)
我已经将 LINQKit 用于类似的方案,并取得了巨大的成功。
具体来说,您应该能够使用该PredicateBuilder
来完成您正在寻找的内容。
通常会
忘记可以跨多个语句继续生成 LINQ 表达式。这是 LINQ 的一大优点。我将简化dasblinkenlight对LINQ-to-SQL转换的回答,该转换将在之后发生:
IQueryable<T> query = Table2;
if (dropdownlist1.SelectedValue == null)
query = query.Where(x => x.stringfield1 == dropdownlist1.SelectedValue);
// etc
这样,任何具有 null 值的内容都不会混入 where 子句中,从而减少了生成的 SQL 中包含不必要条件的机会。
不过,我最喜欢甜甜圈的答案作为更通用的解决方案 - 例如,LINQKit 可以让您在 6 个下拉列表中编写一个循环,如有必要,每个下拉列表都会写入每个 where 子句。