我正在尝试使用条件 API 按值列表进行过滤。我怀疑这是不可能的,我只是在这里问一下以确定。
class Entity
{
int id { get; set; }
IList<Guid> Guids { get; set; }
}
映射:
<class name="Entity">
<id ...></id>
<bag name="Guids" table="Entity_Guids">
<key column="Entity_FK"/>
<element column="Guid"/>
</bag>
</class>
假设我有一个 Guid 列表(实际上这是另一个子查询)。我想过滤Guids列表中至少有一个guid的所有实体。
Sql 看起来像这样:
SELECT *
FROM Entity e
inner join Entity_Guids eg
on e.id = eg.Entity_FK
WHERE
eg.Guid in (subquery)
对于 Criteria API,这似乎是不可能的。
ICriteria query = session
.CreateCriteria(typeof(Entity), "e")
.Add(Subqueries.In("e.Guids", subquery))
抛出异常。
您的查询将不起作用,因为传递给子查询的 e.Guids 属性不是单个值。为此,您实际上是在尝试执行交集并检查该交集是否不为空,不幸的是,标准 api 中不存在该交集,尽管您可以使用 Linq 来执行此操作。
如果您的 Guid 是具有适当属性的实体(Value 属性包含实际的 Guid)并且存在双向关系,您可能仍然可以执行此操作:
var subquery2 = DetachedCriteria.For<GuidEntity>()
.Add(Subqueries.In("Value", subquery))
.SetProjection("Entity_FK");
ICriteria query = session.CreateCriteria(typeof (Entity))
.Add(Subqueries.In("Id", subquery2));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)