我在构建正确的标准以进行特定查询时遇到一些麻烦 - 经过与谷歌教授的一个下午咨询后,我希望有人可以指出我正确的方向。
我有两个感兴趣的实体:OutputTsDef
和NamedAttribute
我要做的是查找具有特定OutputTsDef
值的所有NamedAttribute
。
我可以编写一个独立的条件来查找所有NamedAttributes
给定的名称和价值:
var attributesCriteria
= DetachedCriteria.For<INamedAttribute>()
.Add(Expression.Eq("Name", "some name"))
.Add(Expression.Eq("Value", "some value"));
如何将此注入到OutputTsDef的查询中以限制结果?
var criteria
= nHibernateSession.CreateCriteria(typeof(IOutputTsDefEntity));
// What do I write here?
var results = criteria.List();
NamedAttribute
看起来像这样 - 请注意我们可以使用的[Any]
关于多种实体的NamedAttributes
。
[AttributeIdentifier("DbKey", Name = "Id.Column", Value = "NamedAttributeID")]
[Class(Table = "NamedAttributes")]
public class NamedAttribute : BusinessEntity, INamedAttribute
{
[Any(0, Name = "Entity", MetaType = "System.String", IdType = "System.Int32")]
[MetaValue(1, Class = "Sample.OutputTsDef, Sample.Entities", Value = "OTD")]
[MetaValue(2, Class = "Sample.OutputTimeSeriesAttributesEntity, Sample.Entities", Value = "OTA")]
[Column(3, Name = "OwnerType")]
[Column(4, Name = "OwnerKey")]
public virtual IBusinessEntity Entity { get; set; }
[Property(Column = "Name")]
public virtual string Name { get; set; }
[Property(Column = "Value")]
public virtual string Value { get; set; }
... omitted ...
}
在常规SQL中,我只需要包含一个额外的“where”子句:
where OutputTsDefId
in ( select distinct OwnerKey
from NamedAttributes
where Name = ?
and Value = ?
and OwnerType = 'OTD' )
我错过了什么?
(问题也发布在NHUsers邮件列表中 - 我会在这里复制任何有用的信息。)
答案 0 :(得分:0)
答案 1 :(得分:0)
这就是我最终做的事情 - 以这种方式嵌入SQL子查询检查:
const string subquery
= "{alias}.OutputTsDefId in "
+"( select OwnerKey "
+ " from NamedAttributes na "
+ " where na.Name = ? and na.Value = ? and OwnerType='OTD')";
criteria.Add(
Expression.Sql(
subquery,
new object[] { attributeFilter.Name, attributeFilter.Value },
new IType[] { NHibernateUtil.String, NHibernateUtil.String }));
这不太理想 - 我真的不喜欢以这种方式穿过NHibernate。但是,它完成了工作,这很重要。
我仍然有兴趣找到一个纯粹的NHibernate解决方案,如果有的话。