Небольшой способ для сохранения посещаемости студентов


var studentRepo = new StudentRepository();
int gradeParaleloId = Convert.ToInt32(cmbGradeParalelo.SelectedValue);
var students = studentRepo.FindAllStudentsFromGradeParalelo(gradeParaleloId);

int year = DateTime.Now.Year;
int month = Convert.ToInt32(cmbMes.SelectedIndex) + 1;
AttendanceRepository attendanceRepo = new AttendanceRepository();

for (int i = 0; i < students.Count; i++)
{
    for (int j = 1; j < dataGridView1.Columns.Count; j++)
    {
        DateTime date = new DateTime(year, month, j);

        var student = students[i];
        var attendance = attendanceRepo.FindAttendance(student.StudentId, date);

        if (attendance == null)
        {
            attendance = new Data.Repositories.Attendance();
            attendanceRepo.Add(attendance);
        }

        attendance.StudentId = student.StudentId;
        attendance.DateOfAttendance = date;
        attendance.Attended = dataGridView1[j, i].Value.ToString();
    }
}

attendanceRepo.SaveChanges();

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

Плюс в том, что я каждую явку в DataContext и только нажимать "сохранить" в самом конце как сделки сортов.

Так что я не вставив на каждый день для каждого студента. Представьте на класс из 40 школьников. Это легко \$40 * 30 = 1200\$ запросы на месте.

Есть ли способ для меня, чтобы упростить это? Меня больше беспокоит эта строка:

var attendance = attendanceRepo.FindAttendance(student.StudentId, date);


2153
4
задан 15 апреля 2011 в 12:04 Источник Поделиться
Комментарии
2 ответа

Во-первых, незначительные говядины. Я бы рекомендовал, что вы меняете свои имена индексов должны быть более описательным, особенно внутренний. Например, вы можете сделать запрос РЕПО

DateTime date = new DateTime(year, month, **day**);

Гораздо более читабельным. Если индекс имеет имя, имя это.

Если у вас возникли проблемы с производительностью, попробуйте отделить запросы. В psuedocode:

foreach day in month
get students_with_records from database

foreach student in the_class
if student NOT in students_with_records
add record

Этот метод будет поставить поиск через студенческие записи на клиенте...это должно быть быстрее, поскольку вы будете иметь только один запрос в день, а не один запрос в день на каждого студента. Вы действительно должны профилировать приложение и посмотреть, если это проблема,.

3
ответ дан 16 апреля 2011 в 12:04 Источник Поделиться

Пару вещей:


  1. Хотя я не могу сказать точно, все выглядит так, будто вы храните посещаемость, если студент присутствует. Ваша база данных будет расти очень быстро таким образом. Если возможно, вы могли бы хотеть рассмотреть настольный календарь на учебный год, которое обозначает школьных дней. Таким образом, вам нужно будет только магазин, если студент отсутствует или опаздывает. Настоящее время предполагается и может быть рассчитана на настольный календарь.

  2. Это небольшой, но следующий код не работает:
    инт год = Датавремя.Сейчас.Год

Возьмем, к примеру, преподаватель, что хочет вернуться назад и исправить посещаемости в декабре.
Это выглядит так, как будто они действительно будут выбирать в декабре 2011, а не 2010.

3
ответ дан 18 апреля 2011 в 02:04 Источник Поделиться