C# Linq-动态条件

C# Linq-动态条件,c#,linq,C#,Linq,我有以下疑问: 我想再添加一个动态条件,所以如果用户通过DATEOFBIRTH它应该是e.DATEOFBIRTH e.Id==Id &&e.类别==类别 &&e.加入日期(e) .ToList(); 如何动态调整?听起来您正在尝试执行以下操作: var employees = ctx.Employee.Where(e => e.Id == Id && e.Category == Categor

我有以下疑问:

我想再添加一个动态条件,所以如果用户通过
DATEOFBIRTH
它应该是
e.DATEOFBIRTH e.Id==Id
&&e.类别==类别
&&e.加入日期(e)
.ToList();

如何动态调整?

听起来您正在尝试执行以下操作:

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 employees=ctx.Employee.Where(e=>e.Id==Id
&&e.类别==类别
&&加入日期从您的评论中可以看出:

如果选择了
出生日期
,则应在此处附加条件
根据另一个条件
e.DateOfBirth,您可以使用反射来解决此问题,但还有另一个想法可以帮助您:

  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();
var标准=新字典();
var date=DateTime.Now;//或任何其他值
//初始化你的标准
添加(“DATEOFBIRTH”,e=>e.DATEOFBIRTH e.DateOfJoining e.Id==Id&&
e、 类别==类别&&
标准[selectedValue](e)).ToList();

因此,如果您更改
selectedValue
,输出将基于您要查找的相应标准。

问题不清楚。
DATEOFBIRTH
是什么,
DateTime
还是表示“按出生日期筛选”的字符串?您在哪里遇到了问题,真正的问题是什么?如果选择了出生日期,则应在其中附加一个条件
e.DateOfBirth在本文中的“选择”是什么意思?什么是满足您需求的理想方法签名?
&(date==null?true:用于计算的日期…无论传递给方法的是什么,它都应该包含在条件中…如果
DateOfBirth
传递给触发此Linq查询的方法,则必须附加
DateOfBirth
条件。+1用于提及反射,这将是一个更易于维护的版本。但是这个解决方案也很好,因为条件(标准)可以放在其他地方,必要时可以重用。我会选择字典而不是反射。Serms也可以维护,您可以访问所需的过滤器。通过反射,可以评估任何员工的财产。
var data = ctx.Employee.Where(e => e.Id == Id && 
                                   e.Category == Category && 
                                   e.DateOfJoining <= date &&
                                   (string.IsNullOrWhiteSpace(DATEOFBIRTH) ||
                                    e.DateOfBirth <= DATEOFBIRTH))
                       .ToList();
var data = ctx.Employee
    .Where(e => e.Id == Id && e.Category == Category && e.DateOfJoining <= date);
if(filterbyDateOfBirth)
    data = data.Where(e => e.DateOfBirth <= date);
if(filterbyDateOfAnniversary)
    data = data.Where(e => e.DateOfAnniversary <= date);

var list = data.ToList();
  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();