LINQ 包含在 C# 中

本文关键字:包含 LINQ | 更新日期: 2023-09-27 17:56:53

我有一个如下所示的linq查询。当allStudents包含大量数据时,它非常慢。我从不同的博客中知道Contains非常慢。任何人都可以给我一个更好的解决方案来提高性能。

var selectedStudents = allStudents.Where(s => !studentsIdList.Contains(s.Id));

这里所有学生是一个IQueryable,studentIdList是一个列表

LINQ 包含在 C# 中

似乎你首先把所有学生从某个地方(也许是一个数据库?)拉出来,然后尝试过滤掉他们,这是一个坏主意。相反,您应该让数据库完成工作。

当您处理大量数据并希望获得良好的性能时,请从数据库存储过程中获取,因为 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);}

请告诉我们时差