2012-09-11 3 views
0

При использовании .FromCache() в наборе результатов IQueryable, должен ли я дополнительно позвонить .ToList(), или я могу просто вернуть IEnumerable<>, возвращенный материализованным запросом с помощью FromCache?LINQ .FromCache(). ToList()?

ответ

2

Я предполагаю, что вы используете производную от кода от http://petemontgomery.wordpress.com/2008/08/07/caching-the-results-of-linq-queries/. Если вы посмотрите на реализацию FromCache, вы увидите, что уже вызывается query.ToList(). Это означает, что оцененный список - это то, что кэшируется. Так,

Вам не нужно звонить ToList()

+0

Да, я использую, что 'реализация .FromCache'. –

1

Это зависит полностью от того, что вы хотите с этим сделать. Если вы просто собираетесь на foreach над ним один раз, то вы можете просто оставить его как IEnumerable. Нет необходимости составлять список, чтобы сразу отказаться от него.

Если вы планируете перебирать его несколько раз, то это, вероятно, лучше всего для ToList, так что вы не имеете доступа к базовому IQueryable несколько раз. Вы также должны указать ToList, если возможно, что базовый запрос будет меняться со временем, и вы не хотите, чтобы эти изменения отражались в вашем запросе.

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

Если метод не имеет представления о том, как он будет использоваться, и это просто вспомогательный метод, который будет использоваться еще не написанным кодом, а затем подумайте о возврате IEnumerable. Вызывающий может вызвать ToList, если у них есть веская причина превратить его в список.

Для меня, как правило, я оставляю такие запросы, как IEnumerable, если у меня нет веской причины сделать его List.

Смежные вопросы