你如何在连贯NHibernate一个映射的hasMany做额外的过滤? [英] How do you do additional filtering on a HasMany mapping in Fluent nHibernate?
问题描述
在一个项目,我的工作,我有四个实体(除一堆别人的),工作单,船员,CrewAssignment和承包商。他们的关系是这样的:
In a project I'm working on, I have four entities(amongst a bunch of others), WorkOrder, Crew, CrewAssignment, and Contractor. Their relationship is like this:
- 系统工作单有一个承包商,这是可以改变的
- 系统船员永远只能有一个承包人
- 系统CrewAssignment永远只能有一个船员
- 系统工作单有很多CrewAssignments
- A WorkOrder has one Contractor, which can be changed
- A Crew only ever has one Contractor
- A CrewAssignment only ever has one Crew
- A WorkOrder has many CrewAssignments
我遇到的问题是建立的最后部分,其中一个工作单可以有多个CrewAssignments。我想要做的就是确保WorkOrder.CrewAssignments属性仅返回具有相同承包商的工作单船员的CrewAssignments。或者,少罗嗦,其中WorkOrder.Contractor == CrewAssignment.Crew.Contractor。
The problem I'm having is setting up the last part where a WorkOrder can have multiple CrewAssignments. What I want to do is ensure that the WorkOrder.CrewAssignments property only returns the CrewAssignments that have a Crew with the same Contractor as the WorkOrder. Or, less wordy, "where WorkOrder.Contractor == CrewAssignment.Crew.Contractor".
我已经能够拿出的唯一事情是这样的,但。它抛出关于x变量是不确定的异常
The only thing I've been able to come up with is this, but it throws an exception about the x variable being undefined.
HasMany(x => x.CrewAssignments).KeyColumn("WorkOrderID").Where(x => x.Crew.Contractor == x.WorkOrder.Contractor);
时做这样甚至有可能什么?还是我找错了树完全?谷歌的一上午都没有我这一个。任何想法?
Is doing something like this even possible? Or am I barking up the wrong tree entirely? Google's been failing me all morning with this one. Any ideas?
推荐答案
我不知道,如果它可以帮助你,但这里是我采取在
I don't know if it could help you but here is my take on in.
在 FluentNHibernate 您有一个名为方法在applyFilter
,你可以为了建立在你的映射过滤的子集:
In FluentNHibernate you have a method called ApplyFilter
that you can set up in your mappings in order to filter on child collections :
HasMany(x => x.CrewAssignments).KeyColumn("WorkOrderID").ApplyFilter<MyFilter>().Cascade.AllDeleteOrphan();
然后,您可以创建过滤器:
Then you can create your filter :
public class MyFilter: FilterDefinition
{
public MyFilter()
{
WithName("contractor").WithCondition("Crew.ContractorId== :contractorId").AddParameter("contractorId", NHibernate.NHibernateUtil.Int32);
}
}
然后在你的仓库的实施,您调用过滤器:
Then in the implementation of your repository, you invoke the filter :
Sessions.EnableFilter("contractor").SetParameter("contractorId", 1254);
我不知道这是不是最好的解决办法但在我脑海权的只有一个现在。
I don't know if this is the best solution but the only one that comes to my mind right now.
这篇关于你如何在连贯NHibernate一个映射的hasMany做额外的过滤?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!