Linq - 动态条件

时间:2015-04-01 11:17:52

标签: c# linq

我有以下查询: -

我想再添加一个动态条件,因此如果用户通过DATEOFBIRTH,则应为e.DateOfBirth <= date

var data = ctx.Employee.Where(e => e.Id == Id
                                && e.Category == Category
                                && e.DateOfJoining <= date)
                                .Select(e => e)
                                .ToList();

如何动态调节?

3 个答案:

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

现在,假设filterbyDateOfBirthfilterbyDateOfAnniversarybools

if(filterbyDateOfBirth)
    data = data.Where(e => e.DateOfBirth <= date);
if(filterbyDateOfAnniversary)
    data = data.Where(e => e.DateOfAnniversary <= date);

var list = data.ToList();

由于LINQ的延迟执行,数据库只在ToList处被查询一次。