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

时间:2009-06-17 09:09:22

标签: linq

假设我们有下表:

Person:
  PersonID,
  Name,
  Age,
  Gender

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

编写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

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

3 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:5)

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

var p = from p in Person
       where p.Name == Name_TextBox || Name_TextBox == String.Empty
       select p;

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

答案 2 :(得分:2)

为什么不使用空合并运算符?例如

var products = from a in context.products where a.ID == (productID ?? a.ID) select a;

这在我的系统上非常有效