Как вы делаете дополнительную фильтрацию на отображении HasMany в Fluent nHibernate? - PullRequest
1 голос
/ 16 декабря 2011

В проекте, над которым я работаю, у меня есть четыре объекта (среди множества других): WorkOrder, Crew, CrewAssignment и Contractor. Их отношения такие:

  • WorkOrder имеет одного подрядчика, которого можно изменить
  • Экипаж имеет только одного подрядчика
  • Присвоение экипажу имеет только одну команду
  • WorkOrder имеет много присвоений Crew

У меня проблема с настройкой последней части, в которой WorkOrder может иметь несколько CrewAssignments. Что я хочу сделать, так это убедиться, что свойство WorkOrder.CrewAssignments возвращает только те CrewAssignments, которые имеют Crew с тем же подрядчиком, что и WorkOrder. Или, менее многословно, "где WorkOrder.Contractor == CrewAssignment.Crew.Contractor".

Единственное, что я смог придумать, это это, но он выдает исключение из-за неопределенности переменной x.

HasMany(x => x.CrewAssignments).KeyColumn("WorkOrderID").Where(x => x.Crew.Contractor == x.WorkOrder.Contractor);

Возможно ли сделать что-то подобное? Или я полностью не лаю? Google провалил меня все утро с этим. Есть идеи?

1 Ответ

4 голосов
/ 16 декабря 2011

Я не знаю, может ли это вам помочь, но вот мое мнение.

В FluentNHibernate у вас есть метод с именем ApplyFilter, который вы можете настроить в своих сопоставлениях для фильтрации дочерних коллекций:

HasMany(x => x.CrewAssignments).KeyColumn("WorkOrderID").ApplyFilter<MyFilter>().Cascade.AllDeleteOrphan(); 

Затем вы можете создать свой фильтр:

public class MyFilter: FilterDefinition
{
    public MyFilter()
    {
        WithName("contractor").WithCondition("Crew.ContractorId== :contractorId").AddParameter("contractorId", NHibernate.NHibernateUtil.Int32);
    }
}

Затем при реализации вашего хранилища вы запускаете фильтр:

Sessions.EnableFilter("contractor").SetParameter("contractorId", 1254);

Я не знаю, является ли это лучшим решением, но единственным, которое приходит мне в голову прямо сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...