По сути, вы должны попытаться сослаться на самый широкий тип, который вам нужен. Например, если некоторая переменная объявлена как List<...>
, вы накладываете ограничение на тип значений, которые могут быть ей назначены. Может случиться так, что вам нужен только последовательный доступ, поэтому было бы достаточно объявить переменную как IEnumerable<...>
. Это позволит вам присвоить переменной значения других типов, а также результаты операций LINQ.
Если вы видите, что ваша переменная нуждается в доступе по индексу, вы можете снова объявить ее как IList<...>
, а не просто List<...>
, разрешив присваивать ей другие типы, реализующие IList<...>
.
Для типов возвращаемых функций это зависит от вас. Если вы считаете важным, чтобы функция возвращала ровно List<...>
, вы объявляете, что она возвращает ровно List<...>
. Если единственная важная вещь - это доступ к результату по индексу, возможно, вам не нужно заставлять себя возвращать точно List<...>
, вы можете объявить тип возвращаемого значения как IList<...>
(но на самом деле вернуть экземпляр List<...>
в этом реализации и, возможно, другого типа, поддерживающего IList<...>
позже). Опять же, если вы видите, что единственная важная вещь в возвращаемом значении вашей функции - это то, что она может быть перечислена (и доступ по индексу не нужен), вы должны изменить тип возвращаемого значения функции на IEnumerable<...>
, предоставляя себе больше свободы .
Теперь о AsQueriable
, опять же, это зависит от вашей логики. Если вы считаете, что возможная отложенная оценка - это хорошая вещь в вашем случае, поскольку она может помочь избежать ненужных вычислений, или вы намерены использовать ее как часть какого-то другого запроса, используйте ее. Если вы считаете, что результаты должны быть «материализованы», то есть рассчитаны в этот самый момент, вам лучше вернуть List<...>
. Вам особенно нужно материализовать свой результат, если последующий расчет может привести к другому списку!
С базой данных хорошим правилом является использование AsQueriable
для краткосрочных промежуточных результатов, но List
для "окончательных" результатов, которые будут использоваться в течение некоторого более длительного времени. Конечно, наличие нематериального запроса, зависшего вокруг, делает невозможным закрытие базы данных (так как в момент фактической оценки база данных должна быть все еще открыта).