我正在为我们正在构建的MVC应用程序编码搜索,事情是我想通过对象的各种属性进行搜索。在这个特殊的例子中,这是我期望的行为:
- 如果两个参数都为null或空,则返回all。
- 如果任何参数有值,使用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));
如果两个字段都为null或空,则返回所有元素,或者返回与Name AND/or 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();
对于多可选条件的搜索,您可以这样做(断言"module"是您的"搜索类")
简单,而且(我认为)更易读。为模型的描述和实体属性添加空检查。
//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检查,因为Null上的ToLower()
将引发NRE !
这有点难看,但应该做到这一点,因为条目为空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())))