2013-01-17 45 views
0

我編碼搜索我們正在建設的MVC應用程序,事情是我想通過對象的各種屬性進行搜索。在這種特殊情況下,這是我的預期行爲:Lambda表達式像Sql的值或空

  • 如果兩個參數都爲空或全部返回。
  • 如果任何參數具有值,請使用Contains選擇由該參數過濾的所有參數。

這是我在做什麼:

var model = _svc.GetList(q => q.Name == (string.IsNullOrEmpty(entity.Name) ? q.Name : entity.Name) && 
           q.Description == (string.IsNullOrEmpty(entity.Description) ? q.Description : entity.Description)); 

這將返回要麼如果兩個字段中的所有元素都爲空或空,或者匹配任何元素完全名稱 AND/OR 說明

這裏的東西是我想這表現爲Contains

我已經成功地得到這個工作有一個字段:

var model = _svc.GetList(q => (string.IsNullOrEmpty(entity.Name) || 
      q.Name.ToLower().Contains(entity.Name.ToLower()))).ToList(); 

但是當我添加描述字段,它拋出一個NullReferenceException:未將對象引用設置到對象的實例。

只是爲了檢查我已經試過這一點,它沒有工作之一:

var model = (from q in _svc.GetList() 
      where (string.IsNullOrEmpty(module.Name) || 
       q.Name.ToLower().Contains(module.Name.ToLower())) 
      select q).ToList(); 

model = (from q in model 
     where (string.IsNullOrEmpty(module.Description) || 
      q.Description.ToLower().Contains(module.Description.ToLower())) 
     select q).ToList(); 

回答

2

那麼,對於一個多選標準搜索,你可以做(聲稱「模塊」是你的「搜索類」)。

簡單,和(我認爲)更具可讀性。爲您的模型的描述和實體屬性添加空檢查。

//take all elements 
var model = _svc.GetList(); 

if (!string.IsNullOrEmpty(module.Description)) 
    model = model.Where(m => 
        m.Description != null && 
        m.Description.ToLower().Contains(module.Description.ToLower()); 

if (!string.IsNullOrEmpty(module.Name)) 
    model = model.Where(m => 
        m.Name != null && 
        m.Name.ToLower().Contains(module.Name.ToLower()); 

return module.ToList(); 

空檢查,因爲null上的ToLower()會引發NRE!

1

這是難看一點,但應該做的伎倆,你得到,因爲空Description條目的空引用。如果你正在與Name做任何線索,你可能做這樣的事情q.Description.ToLower().Contains(..)沒有檢查q.Description不爲空

var model = _svc.GetList(q => 
    (string.IsNullOrEmpty(entity.Name) || string.IsNullOrEmpty(q.Name) 
     || q.Name.ToLower().Contains(entity.Name.ToLower())) 

&& (string.IsNullOrEmpty(entity. Description) || string.IsNullOrEmpty(q. Description) 
     || q.Description.ToLower().Contains(entity. Description.ToLower())))