LINQ СОДЕРЖИТ В C#
У меня есть запрос linq, как следующий. Это очень медленно, когда allStudents
содержит большое количество данных. Я знал из разных блогов, что Contains
очень медленно Может кто-нибудь дать мне лучшее решение для улучшения производительности.
var selectedStudents = allStudents.Where(s => !studentsIdList.Contains(s.Id));
Здесь allStudents - это IQueryable, а studentIdList - это список.
4 ответа
Кажется, вы сначала вытаскиваете всех студентов откуда-то (может быть, из дБ?), А затем пытаетесь отфильтровать их, что является плохой идеей. Вместо этого вы должны позволить базе данных делать работу.
Когда вы работаете с большим объемом данных и хотите получить хорошую производительность, тогда извлекайте данные из хранимой процедуры базы данных, потому что linq будет обрабатывать в памяти, так что это займет больше времени.
Вот возможное решение в LINQ, использующее внешнее соединение и исключающее все результаты, где "пустые" значения равны 0. Предполагается, что ни у одного учащегося не будет идентификатора ноль. Для более сложных вы должны использовать 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};
Дает результат 2 4 6 8
Вы пытались получить allstudent в одном запросе
Затем все студенты должны быть исключены из другого запроса, затем итерация первого запроса, удаление ненужного и сравнение времени и сообщить нам:p
var allStudent = allStudents;
Var unwanted = allstudent.Where( s=> studentIdList == s.id);
затем
foreach( var item in unwanted ){
allStudent.remove( item);}
скажите нам разницу во времени плз