2009-10-01 49 views
1

我们正在为系统添加一个属性(标签)。属性表只是一个没有任何外键的关系表。 有没有办法添加到条件来为父表上的属性表生成where子句。非链接表的NHibernate标准

<class name="Account" table="dbo.Account" lazy="true" > 
    <id name="Id" column="`AccountId`"> 
     <generator class="int"/>  
    </id> 
    <property name="Name" column="`Name`" /> 
    <property name="Address" column="`Address`" /> 
</class> 

<class name="Attribute" table="dbo.Attribute" lazy="true" > 
    <id name="Id" column="`AttributeId`"> 
     <generator class="int"/>  
    </id> 
    <property name="Name" column="`Name`" /> 
    <property name="LinkId" column="`LinkId`" /> 
    <property name="Type" column="`Type`" /> 
</class> 

示例数据

Account 
1 - Person - Address 
2 - Person - Address 

Attribute 
1 - Attrib1 - 1 - Account 
2 - Attrib2 - 1 - Account 
3 - Attrib1 - 2 - Account 
4 - Attrib1 - 3 - Event 
5 - Attrib1 - 4 - Location 

现有代码样品

ICriteria crit = session.CreateCriteria(typeof(Account)); 
crit.Add(Restrictions.Eq("Name", "Some");); 

我想以下添加到where子句。

AccountId IN (SELECT LinkId FROM Attribute WHERE Name = 'Attrib1') 
+0

你是什么意思与'没有外键的关系表'? – 2009-10-01 14:02:38

+0

属性表中的linkId是类型字段中定义的表中的主键。 – Thad 2009-10-01 14:04:55

回答

2

为什么你不使用any类型映射?它正是这样做的:通过主键和类型名称引用...

有可能是在下面的一段代码一些错误,但它看起来是这样的:

DetachedCriteria subquery = DetachedCriteria.For<Attribute>() 
    .Add(Projections.Property("LinkId")) 
    .Add(Restrictions.Eq("Name", "Attrib1")) 
    .Add(Restrictions.Eq("Type", typeof(Account))); 


ICriteria crit = session.CreateCriteria(typeof(Account)); 
    .Add(Restrictions.Eq("Name", "Some")) 
    .Add(Subqueries.PropertyIn("id", subquery)); 
+0

.Add(Subqueries.PropertyIn(expression.PropertyName,criteria))是该项目上的正确语法。谢谢。 – Thad 2009-10-01 19:16:25

+0

是的,这是一个错字,我修好了。 – 2009-10-02 12:11:35