Я пытаюсь получить посещаемость каждого класса следующим образом, но мне интересно, есть ли лучший способ справиться с этим, вместо трехкратного вызова метода GetAttendanceLastMonth для каждого класса, есть ли способ вызвать только один раз и получить всю эту информацию.
List<Attendance> chemistry = GetAttendanceLastMonth(schoolId, chemistryId);
List<Attendance> math = GetAttendanceLastMonth(schoolId, mathId);
List<Attendance> music = GetAttendanceLastMonth(schoolId, musicId);
//Plotting them on the chart based on date (x axis) and attendance number(yaxis) values
public List<Attendance> GetAttendanceLastMonth(string schoolId, string classId)
{
try
{
var attendanceNumber = Repository.Get(x => x.SchoolId.Equals(schoolId)).Where(x => x.ClassId.Equals(classId) &&
(DateTime.Now.Date.Subtract(x.AttendanceDate.Date)).TotalDays >= 0 &&
(int)(DateTime.Now.Date - x.AttendanceDate.Date).TotalDays <= 30).ToList();
attendanceNumber.Sort((x, y) => x.AttendanceDate.CompareTo(y.AttendanceDate));
return attendanceNumber ;
}
catch (Exception ex)
{
}
}
Приводит ли текущий вызов репозитория к трем запросам к базе данных? Вы можете объединить запрос к базе данных в один вызов, но тогда вам все равно придется разбивать их на разные коллекции в памяти. Возвращается огромный набор данных? Консолидация на этом этапе может быть преждевременной оптимизацией.
@hotspring Обработка исключений - моя любимая мозоль. И код, который вы показали, совершает смертельный грех обработки исключений - поглощает фатальные исключения. Если вы будете так держать, у вас не будет конца непредсказуемым, не поддающимся обнаружению ошибкам отслеживания, поэтому вам, вероятно, следует пойти и исправить их в среднесрочной перспективе. Вот две статьи по этому вопросу, на которые я часто ссылаюсь: blogs.msdn.com/b/ericlippert/archive/2008/09/10/… | codeproject.com/Articles/9538/…
@hotspring: Я не имел в виду среднесрочные, как в школе. Но как в «не совсем сейчас, но и не совсем последнее, что вы делаете с этим кодом». Особенно, если это продуктивный код, вы не можете проглатывать исключения.





Вы можете вернуть словарь, ключ - ClassId, значение - List<Attendance>, и вы можете использовать Contains для проверки нескольких ClassId:
public Dictionary<string, List<Attendance>> GetAttendanceLastMonth(string schoolId, params string[] classIds)
{
DateTime monthStart = DateTime.Today.AddDays(-DateTime.Today.Day);
DateTime nextMonthStart = monthStart.AddMonths(1);
Dictionary<string, List<Attendance>> attendancesDictionary = Repository
.Get(x => x.SchoolId == schoolId)
.Where(x => classIds.Contains(x.ClassId))
.Where(x => x.AttendanceDate.Date >= monthStart && x.AttendanceDate.Date < nextMonthStart)
.GroupBy(x => x.ClassId)
.ToDictionary(g => g.Key, g => g.OrderBy(x => x.AttendanceDate).ToList());
return attendancesDictionary;
}
Вы можете получить доступ к каждому списку с помощью ключа:
Dictionary<string, List<Attendance>> attendancesDictionary =
GetAttendanceLastMonth(schoolId, chemistryId, mathId, musicId);
// for example the music-list:
List<Attendance> music = attendancesDictionary[musicId];
Я считаю, что было бы неплохо проверить словарь containsKey, чтобы избежать сбоя.
Можете ли вы сгруппировать, чтобы вернуть словарь <строка, список <посещаемость>>?