Search code examples
c#asp.net-corelinq-to-entitiesentity-framework-core

EFCore Linq ThenInclude Two Foreign Keys To Same Table


Does anyone see what I am doing wrong?
ProjectActivityTasks has the UnitOfMeasureId and the ProjectActivityTaskTypeId. With the way it is written, it thinks that UnitOfMeasure goes to ProjectActivityTaskType. It is erroring out on the ThenInclude for UnitOfMeasure saying

ProjectActivityTaskType does not contain a definition for UnitOfMeasure

which is correct. UnitOfMeasure goes to ProjectActivityTasks.

I was referencing this page but it does not seem to work this way: https://learn.microsoft.com/en-us/ef/core/querying/related-data

var qry = await _projectActivityRepository.GetAll()
.Include(x => x.ProjectActivityVehicles)
  .ThenInclude(x => x.Vehicle)
.Include(x => x.ProjectActivityTasks)
  .ThenInclude(x => x.ProjectActivityTaskType)
  .ThenInclude(x => x.UnitOfMeasure)
.Where(x => x.Id == Id && x.TenantId == (int)AbpSession.TenantId)
.FirstOrDefaultAsync();

Solution

  • You can (and should) repeat the Include(x => x.ProjectActivityTasks) part:

    var qry = await _projectActivityRepository.GetAll()
    .Include(x => x.ProjectActivityVehicles)
      .ThenInclude(x => x.Vehicle)
    .Include(x => x.ProjectActivityTasks)
      .ThenInclude(x => x.ProjectActivityTaskType)
    .Include(x => x.ProjectActivityTasks)
      .ThenInclude(x => x.UnitOfMeasure)
    .Where(x => x.Id == Id && x.TenantId == (int)AbpSession.TenantId)
    .FirstOrDefaultAsync();