Я использую ASPX.NET MVC4. Я хочу привести некоторые данные из базы данных через модель, которую я хочу отображать как точки на диаграмме в представлении. На графике я хочу отображать максимум 70 данных (дата, значение), но не более.Оптимизируйте очень медленный следующий код в C#
Моя модель StudentGrades это состоит в следующем
StudentID, ModuleID, TestDate, TestGrade.
Я написал следующий код, который делает фактически работу, но на самом деле медленно, и время это должно не приемлемо.
Вы знаете, как я могу действительно оптимизировать свой код (путем изменения запроса, структур данных, циклов или чего-либо еще)?
Мой код показан ниже.
var query = (from b in db.StudentGrades
where b.StudentID.Equals(InputStudentID)
orderby b.Date
select b);
var dates = query.Select(x => EntityFunctions.DiffDays(query.Min(y => y.Date), x.Date));
var grades = query.Select(x => x.grades);
var datestable = dates.ToArray();
var gradetable = grades.ToArray();
List<int?> dateslist = new List<int?>();
List<double> gradelist = new List<double>();
double result = dates.Count() * 1.0/70.0;
int pointStep = (int)Math.Ceiling(result);
for (int i = 0; i < dates.Count(); i = i + pointStep)
{
dateslist.Add(datestable.ElementAt(i));
gradelist.Add(gradetable.ElementAt(i));
}
ViewBag.dates = dateslist;
ViewBag.grades = gradelist;
Большое спасибо
EDIT
я забыл упомянуть. Я не просто хочу 70 очков. Тогда я мог бы просто взять (70). Я на самом деле хочу, чтобы эти 70 баллов были приняты единообразно из моих данных, основанных на их датах. Так что если, например, у меня есть следующие записи на моей базе данных для конкретного студента, а вместо 70 пунктов я хотел 3:
ModuleID, TestDate, TestGrade
23, 1 January 2014, 5
34, 2 January 2014, 54
45, 3 January 2014, 35
56, 4 January 2014, 55
67, 5 January 2014, 35
78, 6 January 2014, 56
89, 7 January 2014, 53
90, 8 January 2014, 55
94, 9 January 2014, 57
Я бы выбрал рекорд по 1 января 2014, 4 января 2014 и 7 января 2014 или что-то очень похожее. Я имею в виду, что записи, которые я хочу, должны иметь равное или относительно равное расстояние (в датах) между ними.
Это также является причиной того, что у меня есть переменная pointStep выше.
Edit 2
Кроме того, вы можете придумать действительно умный способ для этого, чтобы быть сделано в запросе (без добавления идентификатора, как меняется моя модель)? Если нет, все в порядке, я тоже не могу.
Большого спасибо
Профилируйте его с помощью инструментов VS или, как минимум, с помощью «Секундомера». В общем, поскольку ваш конечный результат представляет собой небольшой набор точек данных, предназначенных для диаграммы, я бы сделал как можно больше работы в базе данных и рассмотрел агрегированные/ограниченные значения в вашей модели. –
@TimMedora благодарит! Да, фактически передайте как можно больше работы в базе данных, это то, что я хочу. Но проблема в том, как? –
Вы можете использовать трассировку профайлера SQL для просмотра запросов (query), которые в настоящее время отправляются в базу данных по вашему коду. Он покажет вам фактические операторы SQL, а также время выполнения. Это может послужить отправной точкой для вашей собственной хранимой процедуры. Хранимая процедура должна выбирать/агрегировать нужные данные. После того, как вы довольны результатами, вызовите хранимую процедуру с помощью ADO.Net и верните «DataReader» или «DataTable». –