0

ASP.NET MVC4 EF CodeFirst を使用しています。

選択した学生が出席するコースのコレクションを取得するために、インデックス アクションでLINQ (エンティティへの) コードを記述するのに助けが必要です。関係は、ペイロードを含む結合テーブルを使用した多対多です。

//StudentController
//-----------------------

public ActionResult Index(int? id)
{
    var viewModel = new StudentIndexViewModel();
    viewModel.Students = db.Students;

    if (id != null)
    {
        ViewBag.StudentId = id.Value;
        // *************PROBLEM IN LINE DOWN. HOW TO MAKE COURSES COLLECTION? 
        viewModel.Courses = db.Courses
            .Include(i => i.StudentsToCourses.Where(t => t.ObjStudent.FkStudentId == id.Value));
    }


    return View(viewModel);
}

私が得たエラーは次のとおりです。

The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties.

私はモデルを持っています(3番目はペイロードを含む結合テーブル用です):

//MODEL CLASSES
//-------------

public class Student
{
    public int StudentId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<StudentToCourse> StudentsToCourses { get; set; }
}

public class Course
{
    public int CourseId { get; set; }
    public string Title { get; set; }

    public virtual ICollection<StudentToCourse> StudentsToCourses { get; set; }
}

public class StudentToCourse
{
    public int StudentToCourseId { get; set; }
    public int FkStudentId { get; set; }
    public int FkCourseId { get; set; }
    public string Classroom { get; set; }

    public virtual Student ObjStudent { get; set; }
    public virtual Course ObjCourse { get; set; }
}

次に、ビューに渡す必要があるモデルビューを次に示します

//VIEWMODEL CLASS
//---------------

public class StudentIndexViewModel
{
    public IEnumerable<Student> Students { get; set; }
    public IEnumerable<Course> Courses { get; set; }
    public IEnumerable<StudentToCourse> StudentsToCourses { get; set; }
}
4

1 に答える 1

1

EF は条件付きインクルードをサポートしていません。all or nothing を含める必要があります (つまり、Where内にno を含めますInclude) 。

特定のリレーションだけのデータを取得する必要がある場合は、(明らかにテストされていない); のような匿名型にデータを選択できます。

var intermediary = (from course in db.Courses
                    from stc in course.StudentsToCourses
                    where stc.ObjStudent.FkStudentId == id.Value
                    select new {item, stc}).AsEnumerable();

これは、StudentsToCourses コレクションを含む単純な Course ではなくなったため、明らかにコードの変更が必要になります。

于 2013-02-02T11:41:22.977 に答える