搜索条件和NULL

时间:2014-12-29 18:51:28

标签: c# entity-framework asp.net-web-api

我在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

3 个答案:

答案 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;
}