寻找构建 Linq 动态/条件表达式的简单方法

本文关键字:表达式 简单 方法 条件 构建 Linq 动态 寻找 | 更新日期: 2023-09-27 18:30:47

给定表为:

表1

  • 编号
  • 字符串字段1
  • 字符串字段2
  • 字符串字段3
  • 字符串字段4

表2

  • 编号
  • table1_id
  • 字符串字段1
  • 日期字段1

给定一个 UI 允许用户对以下内容进行有效查询:

  • dropdwonlist1 包含 anytable1.stringfield1
  • dropdwonlist2 包含 anytable1.stringfield2
  • dropdwonlist3 与 anytable1.stringfield3
  • dropdwonlist4 与 anytable1.stringfield4
  • dropdwonlist5 与 anytable2.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)
(...)

文档中有表达式树,但这看起来太多了。

有没有最简单的方法来构建我的动态查询?

寻找构建 Linq 动态/条件表达式的简单方法

表达式树看起来比实际更可怕,但你是对的,在你的情况下它们是不必要的:你可以使用一个足够聪明的静态条件来忽略没有选择的下拉列表。你可以这样做:

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 子句。