我试图通过使用标准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的列表(实际上这些是另一个子查询)。我要筛选的所有实体,其中至少一个GUID是在GUID列表。

的Sql看起来像这样:

SELECT * 
FROM Entity e 
  inner join Entity_Guids eg 
    on  e.id = eg.Entity_FK
WHERE 
  eg.Guid in (subquery)

通过标准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));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top