0

我正在尝试使用标准 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)

使用 Criteria API,这似乎是不可能的。

ICriteria query = session
  .CreateCriteria(typeof(Entity), "e")
  .Add(Subqueries.In("e.Guids", subquery))

引发异常。

4

1 回答 1

1

您的查询将不起作用,因为传递给子查询的 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));
于 2009-07-01T11:32:16.007 回答