我有一个如下所示的linq查询。当allStudents
包含大量数据时,它非常慢。我从不同的博客中知道Contains
非常慢。任何人都可以给我一个更好的解决方案来提高性能。
var selectedStudents = allStudents.Where(s => !studentsIdList.Contains(s.Id));
这里所有学生是一个IQueryable,studentIdList是一个列表
似乎你首先把所有学生从某个地方(也许是一个数据库?)拉出来,然后尝试过滤掉他们,这是一个坏主意。相反,您应该让数据库完成工作。
当您处理大量数据并希望获得良好的性能时,请从数据库存储过程中获取,因为 linq 将在内存中处理,因此需要更多时间。
下面是 LINQ 中一种可能的解决方案,使用外部联接并排除"空"值为 0 的所有结果。假设没有学生的 ID 为零。对于更复杂的,您应该使用 p == null
.如果源是使用 EF 访问的数据库,则使用数据库。
List<int> allStudents = new List<int> {1,2,3,4,5,6,7,8,9};
List <int> studentsIdList = new List<int> {1,3,5,7,9};
var q =
from c in allStudents
join p in studentsIdList on c equals p into ps
from p in ps.DefaultIfEmpty()
where p == 0
select new { Student = c};
给出结果2468
您是否尝试在一个查询中获取所有学生
然后在另一个查询中排除所有学生,然后迭代第一个查询,删除不需要的并比较时间并告诉我们:p
var allStudent = allStudents;
Var unwanted = allstudent.Where( s=> studentIdList == s.id);
然后
foreach( var item in unwanted ){
allStudent.remove( item);}
请告诉我们时差