NHibernate / LINQ / фильтр дочерней коллекции - PullRequest
1 голос
/ 28 июля 2011

Я пытаюсь на своем уровне обслуживания вернуть 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);
}

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Здесь отличный ответ на SO . Однако он использует Criteria вместо Linq

В основном фильтры здесь ваши друзья.

1 голос
/ 28 июля 2011

Как говорится в сообщении об исключении, вам не разрешено заменять коллекцию, отображенную на cascade = "all-delete-orphan", поэтому не назначайте ничего для p.Properties.Это связано с тем, что NHibernate нужен специальный класс коллекции, чтобы знать, какие дочерние объекты были удалены.

Я думаю, у вас есть две возможности:

  1. Создать свойство в классе Project, которое возвращаетотфильтрованная коллекция (но не изменяет фактическую Properties коллекцию) и используйте это свойство везде, где вам нужны отфильтрованные данные.
  2. Используйте фильтры NHibernate.См. здесь .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...