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);}

скажите нам разницу во времени плз

Другие вопросы по тегам