我有以下查询: -
我想再添加一个动态条件,因此如果用户通过DATEOFBIRTH
,则应为e.DateOfBirth <= date
。
var data = ctx.Employee.Where(e => e.Id == Id
&& e.Category == Category
&& e.DateOfJoining <= date)
.Select(e => e)
.ToList();
如何动态调节?
答案 0 :(得分:1)
你可以使用反射来解决这个问题,但还有另一个想法可以帮助你:
var criteria = new Dictionary<string, Func<Employee, bool>>();
var date = DateTime.Now; //or any other value
//Initialize your criterias
criteria.Add("DATEOFBIRTH", e => e.DateOfBirth <= date);
criteria.Add("DateOfJoining", e => e.DateOfJoining <= date);
var selectedValue = "DATEOFBIRTH";
var data = ctx.Employee.Where(e => e.Id == id &&
e.Category == Category &&
criteria[selectedValue](e)).ToList();
因此,如果您更改selectedValue
,则输出将基于您要查找的相应条件。
答案 1 :(得分:0)
听起来你正试图做以下事情:
var employees = ctx.Employee.Where(e => e.Id == Id
&& e.Category == Category
&& e.DateOfJoining <= date);
if (!string.IsNullOrWhiteSpace(DATEOFBIRTH))
{
employees = employees.Where(e => e.DateOfBirth <= DATEOFBIRTH);
}
var data = employees.ToList();
您也可以执行以下操作,这更简洁,但由于您在此处查询数据库,我更倾向于上述方法,因为它不包含查询中不必要的内容。
var data = ctx.Employee.Where(e => e.Id == Id &&
e.Category == Category &&
e.DateOfJoining <= date &&
(string.IsNullOrWhiteSpace(DATEOFBIRTH) ||
e.DateOfBirth <= DATEOFBIRTH))
.ToList();
答案 2 :(得分:0)
来自你的评论:
如果选择
DateOfBirth
,则应附加条件 再由一个条件e.DateOfBirth <= date
..如果用户选择DateOfAnniversary
然后它应该是e.DateOfAnniversary <= date
然后你可以使用:
var data = ctx.Employee
.Where(e => e.Id == Id && e.Category == Category && e.DateOfJoining <= date);
现在,假设filterbyDateOfBirth
和filterbyDateOfAnniversary
为bools
:
if(filterbyDateOfBirth)
data = data.Where(e => e.DateOfBirth <= date);
if(filterbyDateOfAnniversary)
data = data.Where(e => e.DateOfAnniversary <= date);
var list = data.ToList();
由于LINQ的延迟执行,数据库只在ToList
处被查询一次。