2011-07-20 26 views
0

ContosoUniversity中的示例從 http://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application 如何在學生/詳細信息頁面中顯示每個學生的所有教師。我覺得這是我需要去通過下面的實體去的輔導員數據:使用MVC 3中的實體框架4更新相關數據 - ContosoUniversity

學生(入學人數)

報名(課程)

場(導師)

教師(課程)

我試過使用教師選項卡中的示例,但當我必須爲所有教師準備實體時,我遇到困難。

我創建一個視圖模型:

使用系統;

using System.Collections.Generic;

using 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和Abercrombie,金4022 - 微觀經濟學\t |經濟學| Harui,Roger 4041 - 宏觀經濟學\t |經濟學| Harui,Roger – 2011-07-21 14:41:14

+1

適用於一個學生或沒有學生會?嗯,我的英語不好):所以你想爲一個學生或所有課程的數據庫取出課程(及其依賴關係)嗎? –

+1

也,如果一個答案是有用的或幫助你,請投它:)謝謝親愛的保羅 –