Frage

Ich versuche, durch eine Liste von Werten zu filtern, um die Kriterien API. Ich vermute, dass dies nicht möglich ist, bitte ich nur hier sicher sein.

class Entity
{
  int id { get; set; }
  IList<Guid> Guids { get; set; }
}

Die Zuordnung:

<class name="Entity">
  <id ...></id>
  <bag name="Guids" table="Entity_Guids">
    <key column="Entity_FK"/>
    <element column="Guid"/>
  </bag>
</class>

Mutmaßliche ich eine Liste von Guids haben (eigentlich diese ist eine weitere subquery). Ich möchte alle Entities filtern, wobei mindestens eine GUID in der Liste des Guids ist.

Sql würde wie folgt aussehen:

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

Mit Criteria API, das scheint unmöglich zu sein.

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

Löst eine Ausnahme aus.

War es hilfreich?

Lösung

Ihre Anfrage wird nicht funktionieren, weil die e.Guids Eigenschaft auf die Unterabfrage übergeben kein einziger Wert ist. Um es zu tun auf diese Weise Sie tatsächlich versuchen, sind eine Kreuzung durchführen und prüfen, ob die Kreuzung nicht leer ist, was leider nicht in den Kriterien api nicht vorhanden ist, obwohl Sie wahrscheinlich dies mit Linq tun könnten.

Sie könnten wahrscheinlich noch dies tun, wenn Ihre Guids waren Einheiten mit den entsprechenden Eigenschaften (die Value-Eigenschaft enthält den eigentlichen Guid) und es gab eine bidirektionale Beziehung:

var subquery2 = DetachedCriteria.For<GuidEntity>()
  .Add(Subqueries.In("Value", subquery))
  .SetProjection("Entity_FK");

ICriteria query = session.CreateCriteria(typeof (Entity))
  .Add(Subqueries.In("Id", subquery2));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top