0

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

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

这就是我正在做的事情:

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

如果两个字段都为 null 或为空,则返回所有元素,或者返回与Name AND/OR Description完全匹配的任何元素。

这里的事情是我希望它表现得像Contains.

我已经设法让这个在一个领域工作:

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

但是当我添加描述字段时,它会抛出 NullReferenceException: Object reference not set to an instance of an 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();
4

2 回答 2

3

好吧,对于多可选标准搜索,您可以这样做(断言“模块”是您的“搜索类”)。

简单,并且(我认为)更具可读性。为模型的描述和实体属性添加空检查。

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

空值检查,因为ToLower()空值上的 a 会引发 NRE !

于 2013-01-17T08:47:45.940 回答
1

这有点难看,但应该可以解决问题,因为条目为空,您将获得 null 引用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())))
于 2013-01-17T06:41:58.580 回答