public async Task <byte[]> GetAttendanceReport(AttendanceReportRequest request) { var sql = @" SELECT student.[FirstName], student.[LastName], attendanceStatus.[Status], attendance.[MeetDay] FROM [dbo].[Attendance] attendance INNER JOIN [dbo].[Student] student ON student.[StudentId] = attendance.[StudentId] INNER JOIN [dbo].[AttendanceStatus] attendanceStatus ON attendanceStatus.[AttendanceStatusId] = attendance.[StatusId] WHERE attendance.[ProgramId] = @ProgramId AND ( @StartDate IS NULL AND 1=1 OR attendance.[MeetDay] >= @StartDate ) AND ( @EndDate IS NULL AND 1=1 OR attendance.[MeetDay] <= @EndDate ) "; using (var connection = _iocDbConnectionFactory.GetReadOnlyConnection()) { var report = await connection.QueryAsync <AttendanceReport>(sql, request); var studentAttendanceReportDictionary = GetStudentAttendanceRecordDictionary(report); using (var memoryStream = new MemoryStream()) { using (var streamWriter = new StreamWriter(memoryStream)) { streamWriter.WriteLine(GetAttendanceReportHeaderRow(report.Select(record => record.MeetDay).Distinct())); foreach (var student in studentAttendanceReportDictionary) { streamWriter.WriteLine(GetStudentAttendanceRow(student)); } streamWriter.Flush(); return(memoryStream.ToArray()); } } } }
public async Task <ActionResult> GetProgramAttendanceReport(AttendanceReportRequest request) { return(File(await _studentService.GetAttendanceReport(request), "application/octet-stream", "AttendanceReport.csv")); }