创建依赖于多个搜索字段的动态LINQ查询的最有效方法是什么?

时间:2018-06-07 19:35:16

标签: c# asp.net linq webforms

我正在创建一个Web应用程序,它根据输入的条件从数据库中检索数据。 问题是我有10个不同的搜索字段,只需要填写其中一个,其余的可以为空。

所以我拥有的是:

Textbox1
Textbox2
..
..
Textbox10

我目前的查询是:

checked = false;
if (Textbox1.Text != null)
{
   result = //query here
   checked = true;
}

if (Textbox2.Text != null)
{
    if(checked==false)
    {
       result = //new query here
       checked = true;
    } 
    else
    {

        result = results.Where(...new query to filter Textbox2 from previous 
        query)
    }
}

等等。

如何在一个查询中构建它并忽略没有值的文本框?

由于

2 个答案:

答案 0 :(得分:1)

正如您在问题中提到的,您只需要缩小每个步骤的查询范围。

var result = //query here

if (Textbox1.Text != null)
{
  result = result.Where(r=> r.x == Textbox1.Text);
}

if (Textbox2.Text != null)
{
  result = result.Where(r=> r.y == Textbox2.Text);
}
...

return result;

答案 1 :(得分:0)

另一种方法是在查询本身内进行null / empty检查,使用||运算符以及条件检查text属性是否有值,在括号内形成" sub条款&#34 ;.因为||运算符只要一方评估为true就会返回true,并且评估从左到右完成,所以始终先将null /空检查。

通过这种方式,每个"子句"如果文本框文本为true或为空,则返回null,否则它将根据该文本框的文本值返回条件评估。实际上,这"忽略"文本框的文本属性为null或为空:

var result = data.Where(d => 
    (string.IsNullOrEmpty(Textbox1.Text) || d.X == Textbox1.Text) && 
    (string.IsNullOrEmpty(Textbox2.Text) || d.Y == Textbox2.Text) && 
    (string.IsNullOrEmpty(Textbox3.Text) || d.Z == Textbox3.Text));