你如何在连贯NHibernate一个映射的hasMany做额外的过滤? [英] How do you do additional filtering on a HasMany mapping in Fluent nHibernate?

查看:190
本文介绍了你如何在连贯NHibernate一个映射的hasMany做额外的过滤?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在一个项目,我的工作,我有四个实体(除一堆别人的),工作单,船员,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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆