Загрузка связанных данных объекта ef Core 3.1 с использованием в Включить - PullRequest
1 голос
/ 03 апреля 2020

Для загрузки данных с нескольких уровней я использую include затем, после того как обновил свой проект до tnet core 3.1, он не работает, а четвертый уровень всегда нулевой

var oldMethod = _depositRepository.All()
                    .Include(n => n.StudentStatus.Student.Person.Gender)

, и я пытаюсь использовать ThenInclude

var newMethod = _depositRepository.All()
                    .Include(n => n.StudentStatus)
                        .ThenInclude(s => s.Student)
                            .ThenInclude(p => p.Person)
                                .ThenInclude(g => g.Gender)

В обоих методах Gender всегда будет null

public IQueryable<T> All()
{
    return DbSet.AsNoTracking().AsQueryable();
}

Я следую этому уроку Загрузка связанных данных

Редактировать 1: некоторые моего кода

public class IEntity<IId>
{
    public IId Id { get; set; }
    public string Name { get; set; }
}

public class Gender : IEntity<byte>
{ 
}

public class Person: IEntity<int>
{
    public byte GenderId { get; set; }
    public virtual Gender Gender { get; set; }
}

public class Student : IEntity<int>
{
public int PersonId { get; set; }
public virtual Person Person { get; set; }
}

public class StudentStatus : IEntity<int>
{
    public int StudentId { get; set; }
    public virtual Student Student { get; set; }
}

public class Deposit : IEntity<int>
{
    public int StudentStatusId { get; set; }
    public StudentStatus StudentStatus { get; set; }
}
public interface IRepository<T, IId>
        where T : IEntity<IId>
{
    IQueryable<T> All();
}
public class EfRepository<T, IId> : IRepository<T, IId>
        where T : IEntity<IId>
{
    private readonly UniversityDbContext _dbContext;

    public EfRepository(UniversityDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    private DbSet<T> DbSet => _dbContext.Set<T>();

    public IQueryable<T> All()
    {
        return DbSet.AsNoTracking().AsQueryable();
    }

public class FinancialController : Controller
{
    private readonly IRepository<Deposit, int> _depositRepository;

    public FinancialController(IRepository<Deposit, int>)
    {
        _depositRepository = depositRepository;
    }

    public IActionResult GetStatistic()
    {
        var model= _depositRepository.All()
                        .Include(n => n.StudentStatus)
                            .ThenInclude(s => s.Student)
                                .ThenInclude(p => p.Person)
                                    .ThenInclude(g => g.Gender).ToList();
        return Json(model);
    }
}

Debug window

1 Ответ

0 голосов
/ 06 апреля 2020

Я пришел к выводу, что есть ограничение на то, насколько глубоко вы можете go с ThenInclude, который является трехуровневым. Поэтому я работаю над этим, вызывая _genderRepository и передавая GenderId, чтобы получить Gender объект, однако я не думаю, что это лучшее решение, но это проще, чем писать sql код.

var newMethod = _depositRepository.All()
                    .Include(n => n.StudentStatus)
                        .ThenInclude(s => s.Student)
                            .ThenInclude(p => p.Person)
                                .ThenInclude(g => g.Gender)
                     .Select(n=>new {
                                      ...
                                      Gender=_genderRepository.Find(k=>k.Id==n.StudentStatus.Student.Person.GenderId)
                                     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...