2009-06-17 77 views
5

假设我们有如下表:有条件多个字段搜索和过滤在LINQ

Person: 
    PersonID, 
    Name, 
    Age, 
    Gender 

而且我们提供的搜索功能,使用户能够根据名称和/或的搜索表年龄。

编写SQL(或LINQ)查询的棘手部分是用户可以选择同时搜索字段或任何一个字段,或者不搜索字段。如果他想搜索全部,那么他只需要将文本框留空。

做到这一点的逻辑可以写成如下:

现在后而得到的代码很长,凌乱......我怎么能压缩到上述单一查询与没有如果-else?这是我在SQL可能在LINQ的实施已经使用

回答

4

一种选择太是

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

(请注意,您的“LINQ”是使用SQL语法,这将不会编译。您也可以不声明为你不直接分配一个值做一个VAR)

+0

上我已经更新了代码 – Graviton 2009-06-17 09:33:09

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,它将不会被添加到哪里,如果给定,那么它将被添加。

+0

这是更好的答案迄今。 – Malcolm 2009-06-17 09:41:23

2

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

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

这个作品真的很好我的系统