Во-первых:
специально на дне, где он преобразует объект IQuery к списку
Да, где можно было ожидать, чтобы произойти при нехватке памяти.
Назначение cht
, приведенное выше, фактически не попадает в базу данных; все, что он делает, объявляет форму запроса. Это называется отложенным исполнением, а LINQ использует его повсюду. Это означает, что «мы фактически ничего не обрабатываем, пока ваш код не нуждается в этом».
Вызов ToList
, однако, по сути говорит, что «код нуждается в этом, все это прямо сейчас». Таким образом, он отправляет запрос в базу данных, отталкивает все результаты сразу, использует магию LINQ, чтобы превратить их в объекты CLR, и наполнить их все в List<T>
для вас.
Сказав это, это только догадка, но возможно, что ваш поставщик LINQ не знает, что такое Convert.ToDateTime
. Если он не знает, как с этим справиться, он не будет помещать его в предложение WHERE в запросе, который он выполняет, и вместо этого он будет загружать всю таблицу и фильтровать ее на стороне клиента, что может быть причиной того, что вы сбой, когда таблица становится слишком большой, а не когда результат становится слишком большим.
Чтобы проверить это, используйте профайлер базы данных для перехвата запроса и посмотрите, выглядит ли предложение WHERE, как вы ожидали. Если это не перевод верно, попробуйте вместо этого:
var startTime = Convert.ToDateTime(start);
var endTime = Convert.ToDateTime(end);
var cht = from p in _db.TickerData
where p.Time >= startTime && p.Time <= endTime
orderby p.Time
select p;
_prices = cht.ToList();
Если это не поможет, вы, вероятно, просто отходили слишком много данных, и вы должны будете работать над этим те же способы, которыми Вы бы работа с обработкой слишком большого количества данных в любом другом контексте.
Я попытался создать индекс в столбце [Время] в Sqlexpress. Текущий индекс - это первичный ключ [Id]. – CraigJSte
У вас заканчивается память при попытке загрузить 100 000 строк в память? Как вы думаете, как это исправить? – DavidG
Вопрос в том, что вы делаете с '_prices'? После этого мы расскажем вам, как исправить эту проблему. – Magnus