Entity Framework: Navigation Properties Issue

.net, dbcontext, ef-code-first, entity-framework

Solution

Lazy loading loads the entire set into memory. If you don't want that, switch lazy loading off by removing the `virtual` keyword and use the Query object on the `DbEntry`:

public GetCourseWithActiveStudentsLoaded(int courseid)
{
   var course= context.Courses.Find(courseid); 

   context.Entry(course)
          .Collection(c => c.Students)
          .Query()
          .Where(s => s.Active)
          .Load();

   return user
}

Is the "Active" flag an indicator that you are trying to implement soft delete? If so there is a solution here: Soft Delete in Entity Framework

You can vote for filtered includes here: Allow filtering for Include extension method

Another way to do it would be with inheritance. You could have an `ActiveStudent` inheriting from `Student` and an `ActiveStudents` navigation property as well as an `AllStudents` navigation property in the `Course` class

public virtual Collection<Student> AllStudents { get; set;}
public virtual Collection<ActiveStudent> ActiveStudents { get; set;}

Reference:

Applying filters when explicitly loading related entities:

Problem

I am working with Entity Framework code-first, and I have a class `Course` which has a navigation property `Students`: ``` public virtual Collection<Student> Students { get; set;} ``` It works ok, but as I access this navigation property, all the data is retrieved from the database: ``` var allStudents = course.Students; // Here it retrieves the data var activeStudents = allStudents.Where(n => n.Active); // Here it filter the data on memory var listOfActiveStudents = activeStudents.ToList(); // It already has the data on memory. ``` As you can imagine, I need the query to be executed when I do the `.ToList()` because I don't want to bring all the `Students` from the database, only the active ones. Do you know what I am doing wrong?

Original source

Related problems