我确实有一个Empid字符串,用逗号分隔,比如:
EMpID:"2007,2008,2002,1992,1000,2108,1085
我需要使用LINQ查询检索所有指定员工的记录。我尝试过循环,但我需要以高效、快速的方式做到这一点。
下面是我使用循环所做的操作。
string[] EMpID_str = LeaveDictionary["EMpID"].ToString().Split(',');
for (int i = 0; i < EMpID_str.Length; i++)
{
EMpID = Convert.ToInt32(EMpID_str[i]);
//Linq to get data for each Empid goes here
}
但我需要的是使用单个LINQ或Lambda查询来检索相同的内容。无循环
首先将(逗号(分隔的empId转换为字符串数组,如下所示:
var empArr = EmpId.split(',');
var employeesResult = emplyeeList.Where(x => empArr.contains(x.EmpId.ToString()));
我希望它能帮助到别人。
如果要获取的Id是数字,而不是字符串,则不应将字符串转换为字符串数组,而应转换为数字序列:
IEnumerable<int> employeeIdsToFetch = LeaveDictionary["EMpID"].ToString()
.Split(',')
.Select(splitText => Int32.Parse(splitText));
获取所有具有thees Id的员工:
var fetchedEmployees = dbContext.Employees
.Where(employee => employeeIdsToFetch.Contains(employee.Id))
.Select(employee => new
{
// Select only the employee properties that you plan to use:
Id = employee.Id,
Name = employee.Name,
...
});
您可以使用Expression
类从字符串构建Func<int, bool>
,并将其与Where
方法一起使用:
var str = "2,5,8,9,4,6,7";
var para = Expression.Parameter(typeof(int));
var body = str.Split(",")
.Select(s => int.Parse(s))
.Select(i => Expression.Constant(i))
.Select(c => Expression.Equal(para, c))
.Aggregate((a, b) => Expression.Or(a, b));
Func<int, bool> func = Expression.Lambda<Func<int, bool>>(body, para).Compile();
如果这个解决方案使用linq-to-SQL,那么最后不要编译表达式,而是让linq-to-SQL引擎将其编译为高效的SQL表达式。
代替Aggregate
方法(它将产生具有线性复杂性的表达式(,可以使用分治方法将值折叠成一个值。
例如,此类:
public static class Helper
{
public static T EfficientFold<T>(this List<T> list, Func<T, T, T> func)
{
return EfficientFold(list, 0, list.Count, func);
}
private static T EfficientFold<T>(List<T> list, int lowerbound, int upperbound, Func<T, T, T> func)
{
int diff = upperbound - lowerbound;
var mid = lowerbound + diff / 2;
if (diff < 1)
{
throw new Exception();
}
else if (diff == 1)
{
return list[lowerbound];
}
else
{
var left = EfficientFold(list, lowerbound, mid, func);
var right = EfficientFold(list, mid, upperbound, func);
return func(left, right);
}
}
}
然后我们可以做
var body = str.Split(",")
.Select(s => int.Parse(s))
.Select(i => Expression.Constant(i))
.Select(c => Expression.Equal(para, c))
.ToList()
.EfficientFold((a, b) => Expression.Or(a, b));
这使得评估具有CCD_ 6的复杂性。