Хорошим принципом при выполнении поиска по очень большим коллекциям является ограничение результатов, которые вы обрабатываете, как можно скорее . Я предполагаю, что вы используете пейджинг в своей сетке. И давайте предположим, что PageSize равен 20.
Что вам нужно сделать, это убедиться, что у вас есть доступ к PageSize и текущему PageNo в этом методе. Затем используйте Linq для набора результатов: Take (PageSize) и Skip (PageNo * PageSize). Тогда вам нужно будет обработать только 20 записей.
Тогда у вас есть два варианта. Если вы привязываете напрямую к массиву, вы можете избежать пустых элементов, но я не уверен, поэтому вам, возможно, придется помещать фиктивные элементы в массив источника данных во всех позициях, которые не будут отображаться. Не идеально, но, конечно, быстрее, чем обработка тысяч хитов.
Второй вариант - привязать только 20 элементов к сетке, что будет быстро, отключите подкачку на сетке, так как она покажет только одну страницу, а затем реализуйте свое собственное поведение подкачки, как вы знаете PageSize, и текущий номер страницы. Это займет больше работы, но будет работать намного быстрее, чем готовая привязка gridview к большому источнику данных.
И это поможет вам решить проблему с памятью.