Должен ли я всегда возвращать IQueryable <> вместо IList <>? - PullRequest
1 голос
/ 24 ноября 2010

Я наткнулся на этот пост , пока искал вещи для улучшения производительности.В настоящее время в моем заявлении мы возвращаем IList<> повсюду.Является ли хорошей идеей изменить все эти возвраты на AsQueryable()?

Вот что я нашел -

  • AsQueryable() - контекст должен быть открыт, и вы не можете контролировать время существования контекста базы данных, его нужно правильно расположить.Также это отложенное выполнение («более быстрая фильтрация» по сравнению со списками)
  • IList<> - это должно быть предпочтительнее, чем List<>, так как оно обеспечивает простую и легкую реализацию.* Также, когда следует отдавать предпочтение одному?Я знаю основы, но мне жаль, но я до сих пор не понимаю, когда и как мы должны правильно использовать их в приложении.Было бы здорово узнать об этом, так как в следующий раз я постараюсь запомнить это, прежде чем что-то возвращать ... Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 24 ноября 2010

По сути, вы должны попытаться сослаться на самый широкий тип, который вам нужен. Например, если некоторая переменная объявлена ​​как List<...>, вы накладываете ограничение на тип значений, которые могут быть ей назначены. Может случиться так, что вам нужен только последовательный доступ, поэтому было бы достаточно объявить переменную как IEnumerable<...>. Это позволит вам присвоить переменной значения других типов, а также результаты операций LINQ.

Если вы видите, что ваша переменная нуждается в доступе по индексу, вы можете снова объявить ее как IList<...>, а не просто List<...>, разрешив присваивать ей другие типы, реализующие IList<...>.

Для типов возвращаемых функций это зависит от вас. Если вы считаете важным, чтобы функция возвращала ровно List<...>, вы объявляете, что она возвращает ровно List<...>. Если единственная важная вещь - это доступ к результату по индексу, возможно, вам не нужно заставлять себя возвращать точно List<...>, вы можете объявить тип возвращаемого значения как IList<...> (но на самом деле вернуть экземпляр List<...> в этом реализации и, возможно, другого типа, поддерживающего IList<...> позже). Опять же, если вы видите, что единственная важная вещь в возвращаемом значении вашей функции - это то, что она может быть перечислена (и доступ по индексу не нужен), вы должны изменить тип возвращаемого значения функции на IEnumerable<...>, предоставляя себе больше свободы .

Теперь о AsQueriable, опять же, это зависит от вашей логики. Если вы считаете, что возможная отложенная оценка - это хорошая вещь в вашем случае, поскольку она может помочь избежать ненужных вычислений, или вы намерены использовать ее как часть какого-то другого запроса, используйте ее. Если вы считаете, что результаты должны быть «материализованы», то есть рассчитаны в этот самый момент, вам лучше вернуть List<...>. Вам особенно нужно материализовать свой результат, если последующий расчет может привести к другому списку!

С базой данных хорошим правилом является использование AsQueriable для краткосрочных промежуточных результатов, но List для "окончательных" результатов, которые будут использоваться в течение некоторого более длительного времени. Конечно, наличие нематериального запроса, зависшего вокруг, делает невозможным закрытие базы данных (так как в момент фактической оценки база данных должна быть все еще открыта).

0 голосов
/ 24 ноября 2010

Если вас беспокоит производительность, вы должны также попытаться выполнить ваши запросы на как можно меньшем количестве запросов к БД и кэшировать наиболее часто используемые запросы. Очень часто значительно сокращают время обработки запроса с использованием пакетных подходов.

Какой ORM вы используете для извлечения данных из БД? Если вы используете NHibernate, прочтите этот пост о том, как использовать Future , Multi Criteria 1 , Multi Criteria 2 и Multi Query .

Привет.

0 голосов
/ 24 ноября 2010

если вы не собираетесь выполнять какие-либо дополнительные запросы через сервер sql, вам следует вернуть IList, поскольку он создает данные в памяти

...