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