Добрый день, колеги!
Вопрос про Entity Framework и реализацию Read-only коллекции связанных элементов при использовании DDD (Domain Driven Design).
Например есть сущность "отдел" со список должностей в этом отделе:
public class Department
{
public int DepartmentId { get; private set; }
public string DisplayName { get; private set; }
// Список должностей в отделе
protected virtual ICollection<Position> _positions { get; set; }
public IEnumerable<Position> Positions => _positions.Skip(0);
public static Expression<Func<Department, ICollection<Position>>> PositionsAccessor = f => f._positions;
public void AddPosition(Position position)
{
_positions.Add(position);
}
....
}
public class Position
{
public int PositionId { get; private set; }
public string DisplayName { get; private set; }
public int DepartmentId { get; private set; }
public virtual Department Department { get; private set; }
...
}
Для маппинга можно использовать:
class DepartmentConfiguration : DbEntityTypeConfiguration<Department>
{
public DepartmentConfiguration()
{
HasKey(x => x.DepartmentId);
HasMany(Department.PositionsAccessor)
.WithRequired(x => x.Department)
.HasForeignKey(x => x.DepartmentId)
.WillCascadeOnDelete(true);
....
ToTable("Departments");
}
}
Реализация Read-only списка через статическое поле взято
отсюда или
отсюда.
Все замечательно, можно делать Include, например:
_dbContext.Set<Department>()
.Where(x => x.DisplayName.StartWith("Some name"))
.Include(Department.PositionsAccessor);
Но вопрос: Как реализовать подзапросы к этим самым вложенным элементам. Например нужно получить список отделов, где есть менеджеры.
В таком случае, Linq запрос будет примерно такой:
_dbContext.Set<Department>()
.Where(x => x.Positions.Any(p => p.TypeId == Enums.PositionType.Manager)) // Это срока выдает Exception, так как Positions не является навигационным полем (им является _positions).
.Include(Department.PositionsAccessor);
Как реализовать read-only список связанных сущностей, оставив при этом возможность составлять нормальные linq-запросы? Возможно есть какой-то другой хороший подход, помимо static field?
Буду рад любой помощи, заране спасибо!