NHibernate Criteria用于非链接表

时间:2009-10-01 12:52:57

标签: nhibernate nhibernate-mapping

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

<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')

1 个答案:

答案 0 :(得分: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));