使用带有逗号分隔ID的LINQ从SQL获取所有数据



我确实有一个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的复杂性。

相关内容

  • 没有找到相关文章

最新更新