教室の出席表を適切に表示するのに苦労していました。データベースに出席テーブルがあり、1つの教室のデータを使用して非常に簡単に表示できますが、データベースで出席テーブルを直接参照した場合のように表示されます。
自分の作品を見せることで説明するのはおそらく簡単です。
私は次のクラスを持っています:
実際のクラスルームクラス、またはコース:
public class Course
{
public int CourseID { get; set; }
public string Title { get; set; }
public int AttendanceDate { get; set;}
public virtual ICollection<Enrollment> Enrollments { get; set; } // allows Students to be enrolled in a Course
etc. . .
}
私の学生:
public class Student
{
public int StudentID { get; set; }
public string Name { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; } // allows Student to be enrolled in a Course
etc. . .
}
学生をコースに結び付けるエンティティ:
public class Enrollment
{
public int EnrollmentID { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
}
出席データ:
public class Attendance
{
public int AttendanceID { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
public int AttendanceDay { get; set; } // used to set how many days people are supposed to attend this Course (each course has a different length, some are 10 day courses, some are 3, etc.)
public bool Present { get; set; } // absent or present (set to absent by default)
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
}
私のプロジェクトの流れでは、インストラクターが学生がサインアップするためのコースを作成しています。学生がコースにサインアップすると、必要なすべての出席データがデフォルト値(毎日存在しない)で出席データベーステーブルに入力されます。
for (int i = 0; i < course.AttendingDays; i++)
{
Attendance newAttendance = new Attendance
{
CourseID = course.CourseID,
StudentID = thisStudent.StudentID,
AttendanceDay = i + 1,
Present = false
};
db.Attendance.Add(newAttendance);
db.Save();
}
そのため、多数の出席データを含むデータベーステーブルがあり、次のように並べ替えられて、画面に正しく表示されません。
出席1日目| 2 | 3 | 4 | 5 |
Student1欠席欠席欠席欠席欠席欠席
Student2欠席欠席欠席欠席欠席欠席
Student3欠席欠席欠席欠席欠席欠席
うまくいけば、あなたはそれを読むことができます。。。出席テーブルのかなり標準的なレイアウトだと思います。
GroupByでデータを並べ替えてみました。
var model = from s in db.Attendance
where s.CourseID == 4
group s.AttendanceDay by s.StudentID into t
select new
{
StudentID = t.Key,
Days = t.OrderBy(x => x)
};
return View(model);
これは匿名型のIEnumerableを返します(私が正しく理解している場合)が、このデータを取得して何もできないようです。'simpler'テーブルジェネレーターを使用する場合(そしてAttendanceDay番号でグループ化しようとしない場合)、出席テーブルのデータは問題なく取得されますが、出席の実際のデータベーステーブルを表示するときと同じように並べ替えられます。インストラクターに情報を読んで編集してもらいたい場合に便利です。
匿名タイプのIEnumerable形式の着信出席データを調整するための適切なViewModelと、それに続くそのViewModelを適切に表示するビューが必要だと考えています。。。しかし、私はそのプロセスをどのように処理するかわかりません。
どんな助けでもいただければ幸いです。ありがとうございました。
アップデート:
「クロス集計レポート」/「ピボット」を利用して、次のようなものを使用する必要があると考え始めています:http: //linqlib.codeplex.com/wikipage?title =Pivot&referringTitle=Home
ポインタはありますか?
アップデート2:
以下の受け入れられた答えを使用してほぼ完全に解決されました、そしてこれが私の現在のコントローラーです:
// Generates list of Attendances specifically for current Course
var attendanceItems = db.Attendance.Where(s => s.CourseID == id);
List<Attendance> attendanceItemsList = attendanceItems.ToList();
// End of generating list of Attendances
// CURRENT PROBLEM AREA - INCOMPLETE
var student = attendanceItemsList.Select(a => a.Student).Distinct()/*.OrderBy(a => a)*/; // This works for adding one student, Cannot use OrderBy in its current state - how can I properly order by name? (right now it will order by id I believe)
List<Student> StudentList = student.ToList();;
//
// Generates list of AttendingDays specifically for current Course
Course course = db.Courses.FirstOrDefault(p => p.CourseID == id);
List<int> attDayList = new List<int>();
for (int i = 0; i < course.AttendingDays; i++)
{
attDayList.Add(i + 1);
};
// End of generating list of AttendingDays
AttendanceReportViewModel model = new AttendanceReportViewModel
{
AttendanceDays = attDayList,
Students = StudentList,
Attendances = attendanceItemsList,
};
return View(model);