LINQ仅在参数值大于零时才在where子句中应用过滤器?

时间:2018-02-21 08:33:11

标签: c# .net asp.net-mvc entity-framework linq

我正在使用LINQ从数据库中检索记录。一切都运行正常,除了我需要在单个查询中应用不同的过滤器。如果参数不是Null大于零,则显示所有Employees记录。否则,如果它们是Null或小于零,则不要应用过滤器。以下是我目前的评价:

public ActionResult GetEmployee(int? JobTitleId, int? GenderId)
{
   var Emloyees = db.Employees.ToList();

   if(JobTitleId > 0)
   {
      Emloyees = Emloyees.Where(e => e.JobTitleId == JobTitleId).ToList();
   }

   if(GenderId> 0)
   {
      Emloyees = Emloyees.Where(e => e.GenderId == GenderId).ToList();
   }

}

有没有办法将此应用于单个查询?我希望如果JobTitleIdGenderIdNull,则会显示其他记录,否则请对其进行过滤。

5 个答案:

答案 0 :(得分:3)

您应该将谓词添加到IQueryable,即删除ToList

var employees = db.Employees.AsQueryable();

if (JobTitleId.GetValueOrDefault() > 0)
{
   employees = employees.Where(e => e.JobTitleId == JobTitleId);
}

之后,你调用employees.ToList()谓词将被翻译成SQL,你将从数据库中提取更少的数据。上面的语句只是构建查询而不是执行它。

答案 1 :(得分:2)

您可以编写一个扩展方法来有条件地应用过滤器:

public static IQueryable<T> WhereIf<T>(
   this IQueryable<T> source, bool condition, 
   Expression<Func<T, bool>> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}

用法:

var employees = db.Employees
   .WhereIf(JobTitleId.HasValue, e => e.JobTitleId == JobTitleId)
   .WhereIf(GenderId.HasValue, e => e.GenderId == GenderId)
   .ToList();

此外,使用HasValue而不是与可为空的整数进行比较。

答案 2 :(得分:0)

你可以这样试试。

Emloyees = Emloyees.Where(e=> (JobTitleId > 0 && e.JobTitleId == JobTitleId) || e.GenderId == GenderId).ToList();

答案 3 :(得分:0)

我想你可以做到:

var emloyees = db.Employees.Where(e => (!JobTitleId.HasValue && !GenderId.HasValue) || (JobTitleId > 0 && e.JobTitleId == JobTitleId) || (GenderId > 0 && e.GenderId == GenderId))

但这使得它比当前的解决方案复杂得多。

使用if语句构建LINQ通常是可行的方法。

答案 4 :(得分:0)

希望这能解决,

         List<Employee> emplist = new List<Employee>();
            emplist.Add(new Employee() {EmpName="A",JobTitleId=0,GenderId=0 });
            emplist.Add(new Employee() { EmpName = "B", JobTitleId = 1, GenderId = 0 });
            emplist.Add(new Employee() { EmpName = "C", JobTitleId = 0, GenderId = 1 });
            emplist.Add(new Employee() { EmpName = "D", JobTitleId = 1, GenderId = 1 });
            int jobid = 1;
            int genderid = 1;
            var result = from em in emplist where ((em.JobTitleId > 0 && em.JobTitleId == jobid) ||  (em.GenderId > 0 && em.GenderId == genderid)) select em;           
            foreach (Employee emp in result)
                Console.WriteLine(emp.EmpName);
            Console.ReadKey();