LINQ中的条件多字段搜索和过滤

Gra*_*ton 5 linq

假设我们有下表:

Person:
  PersonID,
  Name,
  Age,
  Gender
Run Code Online (Sandbox Code Playgroud)

我们提供的搜索功能允许用户根据名称和/或年龄搜索表格.

编写SQL(或LINQ)查询的棘手部分是用户可以选择搜索字段,任何一个字段或没有字段.如果他想搜索所有内容,那么他​​只需要将文本框留空.

执行此操作的逻辑可以写成如下:

var p;
if(Name_TextBox=='')
{
   p=from row in person
        select row ;
}
else 
{
  p= from row in person
      where row.Name=Name_TextBox
        select row ;
}
// repeat the same for age
Run Code Online (Sandbox Code Playgroud)

现在过了一段时间,代码变得非常冗长和混乱...如何将上述内容压缩为单个查询而不使用if-else

Wah*_*eed 9

尝试这样的代码

       string personName = txtPersonName.Text;
       int personAge = Convert.ToInt32(txtAge.Text);
       var opportunites =  from p in this.DataContext.Persons
                            select new
                            {
                                p.PersonID,
                                p.Name,
                                p.Age,
                                p.Gender
                            };

        if (personsID != 0)
            opportunites = opportunites.Where(p => p.PersonID == personID);

        if (personName != string.Empty)
            opportunites = opportunites.Where(p => p.Name.StartsWith(personName));

        if (personAge != 0)
            opportunites = opportunites.Where(p => p.Age == personAge);
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作.如果没有给出personName,它将不会添加到where,如果给出则会添加.


Ben*_*jol 5

我在SQL中使用的一个替代方案也可以在Linq中实现

var p = from p in Person
       where p.Name == Name_TextBox || Name_TextBox == String.Empty
       select p;
Run Code Online (Sandbox Code Playgroud)

(请注意,你的'linq'使用的是SQL语法,它不会编译.你也不能像没有直接赋值那样声明var)