Бывают случаи, когда выполнение ToList()запросов в linq может быть важным для обеспечения выполнения ваших запросов в то время и в том порядке, в котором вы ожидаете их выполнить. Эти сценарии, однако, редки, и никто не должен слишком беспокоиться о них, пока они действительно не столкнутся с ними.
Короче говоря, используйте в IEnumerableлюбое время, IListкогда вам нужна только итерация, используйте, когда вам нужно напрямую индексировать и вам нужен массив с динамическим размером (если вам нужна индексация для массива с фиксированным размером, просто используйте стандартный массив).
Что же касается времени выполнения вещь, вы всегда можете использовать список в качестве IEnumerableпеременной, так что не стесняйтесь возвращать IEnumerableпосредством производства .ToList();, или передать в качестве параметра как IEnumerableпутем выполнения .ToList()на IEnumerableв силу исполнения прямо тогда и там. Просто будьте осторожны, чтобы каждый раз, когда вы принудительно .ToList()выполняли выполнение, не зависали от IEnumerableпеременной, которую вы только что сделали, и выполняли ее снова, иначе вы в итоге удвоите количество итераций в своем запросе LINQ.
Что касается MVC, то здесь особо отмечать нечего. Он будет следовать тем же правилам времени выполнения, что и остальная часть .NET, я думаю, что у вас может быть кто-то, кто был немного смущен, вызванным семантикой отложенного выполнения в прошлом, и обвинил его в том, что MVC говорит, что это как-то связано, но это не. Семантика отложенного выполнения сначала смущает всех (и даже на некоторое время потом; они могут быть довольно сложными). Опять же, просто не беспокойтесь об этом, пока вы действительно не позаботитесь о том, чтобы запрос LINQ не выполнялся дважды или не требовал, чтобы он выполнялся в определенном порядке относительно другого кода, после чего назначьте вашу переменную себе. ToList () форсировать исполнение, и все будет в порядке.