我在Web API中使用以下方法模式来搜索给定一组条件的实体:
public IEnumerable<Employee> Search(SearchCriteria searchCriteria)
{
var employees = _dbContext.Employees;
if(searchCriteria.Age.HasValue)
{
employees = employees.Where(e => e.Age == searchCriteria.Age.Value);
}
if(searchCriteria...)
{
employees = employees.Where(e => ...);
}
return employees;
}
如果未指定搜索条件,则SearchCriteria对象上的属性将为null
,我根本不会根据此条件进行过滤。如果已指定,则它将具有值,并用于过滤。
从设计的角度来看,问题在于,如果我真的想要没有年龄的employees
,我就不能这样做,因为我使用null
来判断是否不是我会使用给定的标准。
为了比较两种情况,我应该研究哪种其他方法?
也许查看URI而不是让Web API进行对象映射,我可以确定该标准是否实际存在?
mysite.com/api/employee?keyword=a&age=null
VS
mysite.com/api/employee?keyword=a
答案 0 :(得分:2)
我认为你必须延长你的SearchCriteria
。而不是像Nullable<T>
这样的Nullable<int> Age
属性,您需要一个更详细的结构,如果应该检查该标准,那么它会为您提供信息。
这可能还为您提供了不仅可以将您的标准与逻辑AND组合在一起,还可以从中调整更多功能的选项;)
答案 1 :(得分:0)
对于过滤年龄,也许您可以将年龄设置为-1,以查询没有年龄的员工:
if(searchCriteria.Age.HasValue){
if(searchCriteria.Age != -1)
employees = employees.Where(e => e.Age == searchCriteria.Age.Value);
}
else{
employees = employees.Where(e => e.Age == null);
}
}
答案 2 :(得分:0)
此处无需使用条件检查。如果age的数据库值可以为null,则表示您的域实体必须为int?
,在这种情况下Age
可以在没有.Value
的情况下使用。
public IEnumerable<Employee> Search(SearchCriteria searchCriteria)
{
var employees = _dbContext.Employees.Where(e => e.Age == searchCriteria.Age);
if(searchCriteria...)
{
employees = employees.Where(e => ...);
}
return employees;
}