
 February 28, 2020 11:08 by 
 Peter 
    Eager loading is the process whereby a query for one type of entity also loads related entities as part of the query, so that we don't need to execute a separate query for related entities.

In simple language, Eager loading joins the entities which have foreign relation and returns the data in a single query.
Now, the question is how to properly handle the eager-loading problem for complex object graphs within the Repository pattern.
Let's get started.
Step 1:  Add a method into your Interface which eager loads the entities which we specify:
  public interface IProjectInterface<T> where T : class  
  {  
  Task<IEnumerable<T>> EntityWithEagerLoad(Expression<Func<T, bool>> filter,                string[] children);  
  Task<List<T>> GetModel();  
  T GetModelById(int modelId);  
  Task<bool> InsertModel(T model);  
  Task<bool> UpdateModel(T model);  
  Task<bool> DeleteModel(int modelId);  
  void Save();  
  } 
The method EntityWithEagerLoad() takes 2 arguments, one is filter criteria and another is an array of entities which we want to eager load.
Step 2: Define the method EntityWithEagerLoad in your base repository:
  public async Task<IEnumerable<T>> EntityWithEagerLoad(Expression<Func<T, bool>> filter, string[] children)  
  {  
              try  
              {  
                  IQueryable<T> query = dbEntity;  
                  foreach (string entity in children)  
                  {  
                      query = query.Include(entity);  
    
                  }  
                  return await query.Where(filter).ToListAsync();  
              }  
              catch(Exception e)  
              {  
                  throw e;  
              } 
Step 3 : For using this method , call this function from your controller as shown  below:
  [HttpGet]  
         [Route("api/Employee/getDetails/{id}")]  
         public async Task<IEnumerable<string>> GetDetails([FromRoute]int id)  
         {  
             try  
             {  
        var children = new string[] { "Address", “Education” };  
    
        var employeeDetails=await _repository.EntityWithEagerLoad (d => d.employeeId==id,  
        children);  
    
             }  
             catch(Exception e)  
             {  
                 Throw e;              
             } 
The variable employeeDetails contains employee details with their Address and education details.