У меня есть список, содержащий идентификаторы моей UserProfile
таблицы. Как я могу выбрать все UserProfiles
на основе списка идентификаторов, которые я var
использую LINQ
?
var idList = new int[1, 2, 3, 4, 5];
var userProfiles = _dataContext.UserProfile.Where(......);
Я тут застрял. Я могу сделать это с помощью циклов for и т. Д. Но я бы предпочел сделать это с помощью LINQ
.
Ответы:
Вы можете использовать
Contains()
для этого. Когда вы действительно пытаетесь создатьIN
предложение, это будет немного назад , но это должно сработать:Я также предполагаю, что каждая
UserProfile
запись будет иметьint
Id
поле. Если это не так, вам придется внести соответствующие изменения.источник
Contains()
будет обрабатывать эту проверку равенства для каждогоid
значения, если вы используете его, как я написал в ответе. Вам не нужно явно ничего писать,==
когда вы пытаетесь сравнить элементы одного набора (массива) с другим (таблица базы данных).Решение с .Where и .Contains имеет сложность O (N квадрат). Простой .Join должен иметь намного лучшую производительность (близкую к O (N) из-за хеширования). Итак, правильный код:
А теперь результат моего измерения. Я создал 100 000 UserProfiles и 100 000 id. Присоединение заняло 32 мс, а. Где с .Contains - 2 минуты 19 секунд! Я использовал чистый IEnumerable для этого тестирования, чтобы доказать свое утверждение. Если вы используете List вместо IEnumerable, .Where и .Contains будут быстрее. В любом случае разница существенная. Самый быстрый .Where .Contains - с Set <>. Все зависит от сложности базовых сочетаний для .Contains. Посмотрите этот пост, чтобы узнать о сложности linq. Взгляните на мой тестовый образец ниже:
Вывод в консоль:
источник
List
использовании. +1Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.
об ошибке при использовании контекста данных LINQ2SQL.Хорошие ответы выше, но не забывайте одну ВАЖНУЮ вещь - они дают разные результаты!
Это вернет 2 строки из БД (и это может быть правильно, если вам просто нужен отдельный отсортированный список пользователей)
НО во многих случаях вам может понадобиться несортированный список результатов. Вы всегда должны думать об этом как о SQL-запросе. Пожалуйста, просмотрите пример с корзиной покупок в интернет-магазине, чтобы проиллюстрировать, что происходит:
Это вернет 5 результатов из БД. В этом случае использование «содержит» было бы неправильным.
источник
Это должно быть просто. Попробуй это:
источник