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