Lambda表达式就像Sql其中value或null

时间:2013-01-17 06:02:01

标签: c# .net linq

我正在编写搜索我们正在构建的MVC应用程序,我希望通过对象的各种属性进行搜索。在这种特殊情况下,这是我预期的行为:

  • 如果两个参数均为null或为空,则返回all。
  • 如果任何参数具有值,请使用包含选择由该参数过滤的所有参数。

这就是我正在做的事情:

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));

如果两个字段都为空或空,则返回所有元素,或者返回与名称和/或描述完全匹配的任何元素。

这里的事情是我希望这表现为Contains

我已经成功地使用了一个字段:

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

但是当我添加Description字段时,它会抛出一个NullReferenceException:Object引用未设置为对象的实例。

只是为了检查我已经尝试过这个并且它也不起作用:

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 个答案:

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