我正在使用<dynamic-component>
元素为最终用户提供通过向数据库添加字段来扩展产品功能的能力。
我们的映射的简化版本是:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Caselle.Am0.DTO" assembly="Caselle.Am0.DTO" schema="dbo">
<class name="Asset" table="[tblAsset]" lazy="true">
<id name="ID" column="ID" type="Int32">
<generator class="native" />
</id>
<property name="AssetNumber" column="[AssetNumber]" type="long" not-null="true" />
<dynamic-component insert="true" update="true" name="UserDefinedFields" />
<many-to-one name="Classification" column="tblClassificationID" class="Lib.DTO.Classification, Lib.DTO" cascade="none" />
</class>
<class name="Classification" table="[tblClassification]" lazy="true">
<id name="ID" column="ID" type="Int32">
<generator class="native" />
</id>
<property name="Name" column="[Classification]" type="String" not-null="true" length="20" />
<dynamic-component insert="true" update="true" name="UserDefinedFields" />
<set name="Assets" table="tblAsset" lazy="true" cascade="all-delete-orphan" inverse="true">
<key column="tblClassificationID"/>
<one-to-many class="Lib.DTO.Asset, Lib.DTO"/>
</hibernate-mapping>
这些类看起来像这样:
public class Asset
{
public virtual long AssetNumber{get; set;}
public Classification Classification {get; set;}
public virtual IDictionary UserDefinedFields {get; set;}
}
public class Classification
{
public virtual string Name {get; set;}
public virtual ICollection<Asset> Assets {get; private set;}
public virtual IDictionary UserDefinedFields {get; set;}
}
我遇到的问题是,现在用户想在他们的自定义字段上使用我们的过滤工具,当我运行以下查询时,我得到一个QueryException(无法解析属性'X'):
var query = session.CreateCriteria<Asset>()
.Create Alias("c", "Classification")
.Add(Restrictions.Eq(Projections.Property("c.X"), "value")
.ToList<Asset>();
可以做这种投影吗?我怎么可能写这个查询(我真的很喜欢Criteria API,因为我正在动态生成这个查询,但是如果我必须以其他方式工作......)?
答案 0 :(得分:1)
我认为你不想在那里使用投影。尝试交换
.Add(Restrictions.Eq(Projections.Property("c.X"), "value")
的
.Add(Restrictions.Eq("c.UserDefinedFields.X", "value")