3

コントローラーからビューに linq リスト オブジェクトを渡そうとしています。linq オブジェクトには、何らかのエラーをスローしているグループ化が含まれています。グループ化されたオブジェクトをビューに表示したいだけです。linq ステートメントは完全に機能しますが、ステートメントを表示すると機能しません! どんな助けでも大歓迎です!

コントローラ

        public ViewResult StudentAttendanceForYear(int id)
    {

        DateTime finDate = System.DateTime.Today;
        DateTime strtDate = DateTime.Today.AddMonths(-6);


        var chosenStudent = (from t in db.ClassInstanceDetails.Include("Student")
                                 where (t.Attendance == false) && (t.StudentID == id)
                                 && (t.ClassInstance.Date > strtDate) && (t.ClassInstance.Date < finDate)
                                 group t by new { t.ClassInstance.Date.Year, t.ClassInstance.Date.Month, t.ClassInstance.Date.Day } into grp
                                 select new
                                 {

                                     absentDate = grp.Key,
                                     numAbsences = grp.Count(t => t.Attendance == false)

                                 }).ToList();



        return View(chosenStudent.ToList());
    }

見る

視点を変えてみました

@model IEnumerable<System.Linq.IGrouping<object, FYPSchoolApp.DAL.ClassInstanceDetail>>

それでも運が悪く、次のエラーが発生し続けます。

ディクショナリに渡されたモデル アイテムのタイプは 'System.Collections.Generic.List 1[<>f__AnonymousType72[<>f__AnonymousType6 3[System.Int32,System.Int32,System.Int32],System.Int32]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1[System.Linq.IGrouping`2[System.Object,FYPSchoolApp.DAL.ClassInstanceDetail]]' です。

4

1 に答える 1

2

匿名型をモデルとしてビューに渡そうとしないでください。

必要なのはViewModelです:

public class AbsentCountViewModel
{
   public DateTime absentDate { get; set; }
   public int numAbsences { get; set; }
}

次に、クエリを変更してビューモデルに選択します

var chosenStudent = 
   (from t in ...
   group t by new 
   { 
           t.ClassInstance.Date.Year, 
           t.ClassInstance.Date.Month, 
           t.ClassInstance.Date.Day 
   } into grp
   select new
   {
       absentDate = grp.Key,
       numAbsences = grp.Count(t => t.Attendance == false)
   }).ToList()
   // you need to do the select in two steps 
   // because EF cannot translate the new DateTime
   .Select(item => new AbsenctCountViewModel
   {
       absentDate = new DateTime(item.absentDate.Year, 
                                 item.absentDate.Month, 
                                 item.absentDate.Day)
       numAbsences = item.numAbsences
   }).ToList();

return View(chosenStudent);

最後に、@model を使用してビューで結果にアクセスできます。

@model List<AbsenctCountViewModel>
于 2013-02-19T21:02:57.777 に答える