Я пытаюсь на своем уровне обслуживания вернуть Parent, у которого есть коллекция дочерних объектов, которые мне нужно отфильтровать. Только дочерние объекты фильтруются, поэтому, даже если фильтр означает 0 дочерних объектов, родительский объект все еще возвращается.
Как видно из приведенного ниже кода, метод, который я пытаюсь использовать здесь, очень прост. Я изучил другие вопросы SO, которые кажутся похожими, но еще не получили ответа.
- Мне не требуется, чтобы фильтр появлялся при запросе к базе данных, хотя, если это возможно, все будет в порядке.
- Если используется один оператор LINQ, то фильтрация всех дочерних объектов все равно должна возвращать Parent (Project).
Я знаю, что это можно решить, добавив предложение WHERE в Mapping, но это позволяет вам каскадно удалять.
При использовании приведенного ниже кода выдается следующее исключение:
На коллекцию с cascade = "all-delete-orphan" больше не ссылался экземпляр объекта-владельца: Project.Properties
// Сущности
public class Project
{
public virtual int Id { get; set; }
private ICollection<Property> properties = new List<Property>();
public virtual ICollection<Property> Properties
{
get { return properties; }
set { properties = value; }
}
}
public class Property
{
public virtual DateTime? DateDeleted { get; set; }
}
// Свободное отображение NHibernate
mapping.HasMany<Property>(x => x.Properties)
.ForeignKeyConstraintName("Project_Id")
.AsSet()
.Cascade.AllDeleteOrphan()
.OrderBy("Estate_Id");
// Сервисный уровень: вызов репозитория проекта. только возврат проекта с активными свойствами
private ProjectDto GetActiveProject(int id)
{
var p = projectRepository.Get(id);
//filter out deleted properties
if (p != null)
p.Properties = p.Properties.Where(x => x.DateDeleted == null).ToList();
return projectTransformer.Transform(p);
}