我正在编写搜索我们正在构建的MVC应用程序,我希望通过对象的各种属性进行搜索。在这种特殊情况下,这是我预期的行为:
这就是我正在做的事情:
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();
答案 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())))