Обновление связанных данных с Entity Framework 4 в MVC 3 - ContosoUniversity - PullRequest
0 голосов
/ 20 июля 2011

В примере ContosoUniversity от http://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application Как отобразить ВСЕХ инструкторов для каждого учащегося на странице «Студент / Подробности».Я считаю, что мне нужно пройти через следующие организации, чтобы получить данные преподавателей:

Студент (зачисления)

Зачисление (курс)

Курс (преподаватели))

Инструкторы (курсы)

Я пытался использовать пример на вкладке «Инструкторы», но застрял, когда мне нужно подготовить сущность со всеми инструкторами.

Я создал модель представления:

, используя System;

, используя 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; }

}

}

А затем я начал со следующей новой страницы MoreDetails из StudentController

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);
    }

Заранее благодарю за любую помощь.

1 Ответ

0 голосов
/ 21 июля 2011

попробуйте этот код:

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();

и вы увидите этот SQL-оператор в stdquery:

{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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...