Интерфейс IQueryable
позволяет определять части запроса у удаленного провайдера LINQ (как правило, для базы данных, но не обязательно) в несколько этапов и с отсроченным исполнением.
E.g. ваш уровень базы данных может определить какое-либо ограничение (например, на основе разрешений, безопасность - независимо), добавив в ваш запрос предложение .Where(x => x.......)
. Но пока это не выполняется. вы не извлекаете 150'000 строк, соответствующих этим критериям.
Вместо этого вы передаете интерфейс IQueryable
на следующий уровень, бизнес-уровень, где вы можете добавлять дополнительные требования и где предложения к вашему запросу - опять же, ничего не выполняется, пока вы еще не выкидываете 80'000 ваших 150'000 строк, которые вы получили - вы просто определяете дополнительные критерии запроса.
И слой UI может делать то же самое, например. основанный на вводе пользователя в форме или что-то в этом роде.
Магия в том, что вы передаете интерфейс IQueryable
через все слои, добавляя к нему дополнительные критерии, но он не получает выполнение/оценку, пока вы на самом деле его не нажмете. Это также означает, что вам не нужно выбирать и извлекать тонны данных, которые вы в конечном итоге отбрасываете.
Вы не можете сделать это с классическим статическим списком - вам нужно выбрать данные, возможно, отбросить их много позже в процессе - в конце концов, у вас есть статический список.
'IQueryable' принципиально отличается от' list' - оба имеет свою область применения. –