2015-04-01 49 views
1

我有以下查询: -LINQ的 - 动态条件

我想补充一个条件是动态的,因此,如果用户通过DATEOFBIRTH应该e.DateOfBirth <= date

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

如何动态调节?

+0

问题不清楚。什么是“DATEOFBIRTH”,“DateTime”或意味着“按出生日期筛选”的字符串?你卡在哪里,真正的问题是什么? – 2015-04-01 11:19:49

+0

如果选择了DateOfBirth,那么'where'条件应该附加一个条件'e.DateOfBirth <= date' ..如果用户选择DateOfAnniversary,那么它应该是'e.DateOfAnniversary <= date' .. – Anup 2015-04-01 11:22:16

+0

什么意思在这种情况下“选择”?您的要求的理想方法签名是什么? – 2015-04-01 11:23:20

回答

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(); 
+0

有没有这方面的任何捷径,因为有一个很长的属性列表。 – Anup 2015-04-01 11:26:21

0

从您的评论:

如果DateOfBirth被choosen,那里有状态应该由一个条件e.DateOfBirth <= date附加 ..如果用户选择 DateOfAnniversary那么它应该是e.DateOfAnniversary <= date

然后您可以使用:

现在210
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只有一次。

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

+1提到反射,这将是一个更可维护的版本。但是这个解决方案也很棒,因为条件(标准)可以放在别的地方,如果需要的话可以重新使用。 – Franck 2015-04-01 11:46:03

+1

我会反思字典。 Serms也是可以维护的,你可以访问你想要的过滤器。通过反思,可以评估任何员工的财产。 – 2015-04-01 12:17:39