Entity framework zapytanie do bazy

Odpowiedz Nowy wątek
2017-03-17 15:06
0

Witam. Nie działa mi wyświetlanie informacji o studencie. Dostaje błąd: The model item passed into the dictionary is of type 'System.Data.Entity.Infrastructure.DbQuery`1[WebApplication1.Models.Student]', but this dictionary requires a model item of type 'WebApplication1.Models.Student'.

Jak rozumiem to w akcji zwracam coś innego niż oczekuje widok.

Moja akcja:

public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            var student = db.Students.Include("Courses").Where(p => p.ID == id);

            if (student == null)
            {
                return HttpNotFound();
            }
            return View(student);
        }

Tabele z relacją wiele do wielu

public class Course
    {

        public Course()
        {
            Students = new HashSet<Student>();

        }
        public int CourseID { get; set; }

        public string Title { get; set; }
        public int Credits { get; set; }
        public Grade? Grade { get; set; }        
        public virtual ICollection<Student> Students { get; set; }
    }
public class Student
    {
        public Student()
        {

            Courses = new HashSet<Course>();
        }
        public int ID { get; set; }
        public string LastName { get; set; }
        public string FirstMidName { get; set; }
        public DateTime EnrollmentDate { get; set; }

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

Chodzi o to że wyświetlam dane studenta wraz z jego wszystkimi kursami.
Widok mam silnie typowany więc oczekuje Model.Student
Jak to ładnie zrobić żeby działało?
Jedyne rozwiązanie które mi zadziałało to w widoku dałem @model List<[WebApplication1.Models.Student>
A w zapytaniu na końcu dołożyłem .ToList();
Czyli zwracam listę z jednym studentem i w widoku muszę robić np model[0].LastName
Wcześniej miałem coś takiego Student student=db.Student.find(id);
I tu otrzymałem dane studenta i ładnie pokazywało ale niestety nie wyświetlało mi jego kursów.
I pytanie poza konkursem. W widoku przy wyrażeniach lambda nie mogę zobaczyć intellisense. Tzn pojawia się i znika szybko. Jest jakiś sposób na to?

edytowany 1x, ostatnio: szydlak, 2017-03-17 15:16

Pozostało 580 znaków

2017-03-17 15:17
1

Where zwraca kolekcje a w widoku oczekujesz pojedynczego obiektu.
var student = db.Students.Include("Courses").SingleOrDefault(p => p.ID == id);

edytowany 1x, ostatnio: error91, 2017-03-17 15:18

Pozostało 580 znaków

2017-03-17 15:24
0

No i pięknie. O to mi chodziło. A gdzie można poczytać jak konstruować tego typu zapytania?

Pozostało 580 znaków

2017-03-17 15:28
0

Szukaj informacji o LINQ.

Pozostało 580 znaków

2017-03-17 21:55
3
error91 napisał(a):

Where zwraca kolekcje

Gwoli ścisłości: Where zwraca zapytanie, które można zmaterializować metodami: ToList, Single*, First*, itp.

@szydlak, w ogóle, to użyj EF nowszego niż 4, wtedy będziesz mógł robić silnie typowanego Include, a nie stringiem, w którym łatwo o pomyłkę: https://msdn.microsoft.com/en[...]brary/gg671236(v=vs.103).aspx


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2017-03-17 22:25
0

@somekind, Dzięki za link, dopiero zaczynam więc korzystam z różnych tutoriali.

Pozostało 580 znaków

2017-03-17 23:12
0

Patrz zatem na ich daty. :)


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0