我正在使用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();
}
}
有没有办法将此应用于单个查询?我希望如果JobTitleId
和GenderId
为Null
,则会显示其他记录,否则请对其进行过滤。
答案 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();