Одна проблема, которую я вижу, это то, что вы используете общий репозиторий. Он может работать для простых случаев, но, как вы сказали, если вам нужно присоединиться, этот подход не сработает. Таким образом, одним из улучшений было бы создание определенных репо
public interface ISkillLevelsRepository : IRepository<SkillLevels>
{
//have specific methods to achieve what you want
}
Другой подход заключается в использовании нескольких хранилищ внутри класса обслуживания и удалении Factory
.
private readonly IRepository<SkillLevels> _skillsRepository;
private readonly IRepository<Student> _studentRepository;
private readonly IUnitOfWork _unitOfWork;
public SkillLevelService(IRepository<SkillLevels> skillsRepository, IRepository<Student> studentRepository, IUnitOfWork unitOfWork)
{
_skillsRepository= skillsRepository;
_studentRepository = studentRepository;
_unitOfWork = unitOfWork;
}
Затем получите доступ к нескольким репо, чтобы достичь того, что вам нужно.
Еще одна вещь, если вы правильно определили свою модель со всеми навигационными полями, вам, возможно, не понадобится делать объединения, потому что EF добавит объединения при обращении к навигационным свойствам.