3

给定表格为:

表格1

  • ID
  • 字符串字段1
  • 字符串字段2
  • 字符串字段3
  • 字符串字段4

表2

  • ID
  • table1_id
  • 字符串字段1
  • 日期字段1

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

  • dropdwonlist1 与任何table1.stringfield1
  • 具有任何值的 dropdwonlist2和table1.stringfield2
  • dropdwonlist3 与任何table1.stringfield3
  • dropdwonlist4 与任何table1.stringfield4
  • dropdwonlist5 与任何table2.stringfield1
  • dropdwonlist6 与 [任何、该、之前、之后、之间]
  • calendar1 与table2.datefield1链接
  • calendar2 与table2.datefield1链接

作为结果 datagridview 与everyfields。

我想建立条件查询,好像不是“任何”添加这个条件

考虑到这一点,简单的 LINQ 查询不适用:

Table2
  .Where(x => x.stringfield1 == dropdwonlist1.SelectedValue)
  .Where(x => x.stringfield2 == dropdwonlist2.SelectedValue)
  .Where(x => x.stringfield3 == dropdwonlist3.SelectedValue)
(...)

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

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

4

3 回答 3

6

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

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)
于 2013-09-10T20:26:02.677 回答
2

我已经将LINQKit用于类似的场景并取得了巨大的成功。

具体来说,您应该能够使用PredicateBuilder来完成您要查找的内容。

于 2013-09-10T20:24:05.963 回答
1

通常会忘记您可以跨多个语句继续构建 LINQ 表达式。这是 LINQ 的一大优点。我会简化 dasblinkenlight 对 LINQ-to-SQL 转换的回答,这将在之后发生:

IQueryable<T> query = Table2;

if (dropdownlist1.SelectedValue == null)
    query = query.Where(x => x.stringfield1 == dropdownlist1.SelectedValue);
// etc

这样一来,任何具有空值的东西都不会混入 where 子句,从而减少生成的 SQL 中包含不必要条件的机会。

不过,我最喜欢 Donut 的答案,因为它是一个更通用的解决方案——例如,LINQKit 可以让你在 6 个下拉列表上编写一个循环,如果需要,它会写入每个 where 子句。

于 2013-09-11T05:15:05.587 回答