2011-07-20 16 views
0

ContosoUniversityの例 http://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application 生徒/詳細ページにすべての講師を表示するにはどうすればよいですか?私は何を信じて、私はインストラクターのデータを取得するには、以下のエンティティを通過する必要があることです。MVC 3のEntity Framework 4で関連データを更新する - ContosoUniversity

学生(加入契約)

入学(コース)

コース(インストラクター)

インストラクター(コース)

私はインストラクターのタブの例を使用しようとしましたが、すべてのインストラクターでエンティティを準備する必要があるときに固まってしまいます。

私は、ビューモデル作成:システムを使用して

を。

using System.Collections.Generic;

ContosoUniversity.Modelsを使用する。

名前空間ContosoUniversity.ViewModels

{

public class StudentIndexData 

{

public IEnumerable<Student> Students { get; set; } 

    public IEnumerable<Enrollment> Enrollments { get; set; } 

    public IEnumerable<Course> Courses { get; set; } 

    public IEnumerable<Instructor> Instructors { get; set; } 

} 

}

そして私はStudentController

から次の新しいMoreDetailsページで開始

public ActionResult MoreDetails(System.Int32? iStID)

{ 
     var viewModel = new StudentIndexData(); 
     viewModel.Students = ctxDB.ctxStudents 
     .Include(i => i.Enrollments.Select(c => c.Course)) 
     .Where(i => i.StudentID == iStID); 



     if (iStID != null) 
     { 
      ViewBag.StudentID = iStID; 

      viewModel.Enrollments = viewModel.Students.Where(i => i.StudentID == iStID).Single().Enrollments; 
     } 

     HERE IS WHERE I GET STUCK I DO NOT KNOW HOW TO POPULATE THE INSTRUCTORS ENTITY. AND COURSES ALSO. 

     return View(viewModel); 
    } 

ありがとうございました。

答えて

0

このコードを試してみてください。

var std = db.Students 
      .Include(s => s.Enrollments.Select(en=>en.Course)) 
      .Where(s => s.StudentId == id) 
      .SingleOrDefault(); // or ToList() if you want fetch all students 

if(std != null){ 

    // do your work, for example, accessing this properties: 
    var a = std; // the student 
    var b = std.Enrollments; // student's enrollments 
    var c = std.Enrollments.First().Course; // test for access one of the enrollments's course 
    var d = c.Instructors; // test for access course's instructors all 

    // or project all instructors in a List: 
    var instructors = new List<Instructor>(); 
    foreach (var enr in std.Enrollments) { 
     foreach (var ins in enr.Course.Instructors) { 
      if (!instructors.Contains(ins)) { 
       instructors.Add(ins); 
      } 
     } 
    } // now, the "instructors" contains all instructors associated with current user! 

}else{ 
    // if is null, do something else 
} 

よろしく

を更新して、クエリをテストしたい場合は、最初の行を置き換え、これを聖霊降臨祭:

var stdquery = db.Students 
       .Include(s => s.Enrollments.Select(en=>en.Course)) 
       .Where(s => s.PersonID == id); 
var std = stdquery.SingleOrDefault(); 

とstdqueryでこのSQL文が表示されます。

{SELECT 
[Project1].[PersonID] AS [PersonID], 
[Project1].[C1] AS [C1], 
[Project1].[LastName] AS [LastName], 
[Project1].[FirstName] AS [FirstName], 
[Project1].[EnrollmentDate] AS [EnrollmentDate], 
[Project1].[C2] AS [C2], 
[Project1].[EnrollmentID] AS [EnrollmentID], 
[Project1].[CourseID] AS [CourseID], 
[Project1].[PersonID1] AS [PersonID1], 
[Project1].[Grade] AS [Grade], 
[Project1].[CourseID1] AS [CourseID1], 
[Project1].[Title] AS [Title], 
[Project1].[Credits] AS [Credits], 
[Project1].[DepartmentID] AS [DepartmentID] 
FROM (SELECT 
    [Extent1].[PersonID] AS [PersonID], 
    [Extent1].[LastName] AS [LastName], 
    [Extent1].[FirstName] AS [FirstName], 
    [Extent1].[EnrollmentDate] AS [EnrollmentDate], 
    '0X0X' AS [C1], 
    [Join1].[EnrollmentID] AS [EnrollmentID], 
    [Join1].[CourseID1] AS [CourseID], 
    [Join1].[PersonID] AS [PersonID1], 
    [Join1].[Grade] AS [Grade], 
    [Join1].[CourseID2] AS [CourseID1], 
    [Join1].[Title] AS [Title], 
    [Join1].[Credits] AS [Credits], 
    [Join1].[DepartmentID] AS [DepartmentID], 
    CASE WHEN ([Join1].[EnrollmentID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2] 
    FROM [dbo].[People] AS [Extent1] 
    LEFT OUTER JOIN (SELECT [Extent2].[EnrollmentID] AS [EnrollmentID], [Extent2].[CourseID] AS [CourseID1], [Extent2].[PersonID] AS [PersonID], [Extent2].[Grade] AS [Grade], [Extent3].[CourseID] AS [CourseID2], [Extent3].[Title] AS [Title], [Extent3].[Credits] AS [Credits], [Extent3].[DepartmentID] AS [DepartmentID] 
     FROM [dbo].[Enrollments] AS [Extent2] 
     INNER JOIN [dbo].[Courses] AS [Extent3] ON [Extent2].[CourseID] = [Extent3].[CourseID]) AS [Join1] ON [Extent1].[PersonID] = [Join1].[PersonID] 
    WHERE ([Extent1].[Discriminator] = 'Student') AND ([Extent1].[PersonID] = @p__linq__0) 
) AS [Project1] 
ORDER BY [Project1].[PersonID] ASC, [Project1].[C2] ASC} 
+1

Javad、ありがとうございます。唯一のことは、コースとの関係(エンティティとして)と一緒にすべてのインストラクターを必要としていたからです。私は、学生のコースとそれに対応するインストラクターとの表を見ることができます。 foreachループでビューを生成するときに役立つと仮定します。前もって感謝します。科目|学部|インストラクター1050 - 化学|工学| Fakhouri、Fadi and Abercrombie、Kim 4022 - Microeconomics \t |経済| Haru、Roger 4041 - Macroeconomics \t |経済| Harui、Roger –

+1

うーん、私の英語は良くありません):あなたは1つの生徒のためのコース(およびその依存関係)を取得したいのですが、フィルターを使用しないでdbのすべてのコースを取得しますか? –

+1

また、答えが役に立つか、あなたを助けたら、それを投票してください:)親愛なるポールありがとう –

関連する問題