2009-06-26 5 views
0

Ich versuche, durch eine Liste von Werten mithilfe der Kriterien API zu filtern. Ich vermute, dass das nicht möglich ist, ich frage nur hier um sicher zu sein.NHibernate: Query-Filterung auf einer Liste von Werten mit Kriterien

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

Die Abbildung:

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

Angenommene Ich habe eine Liste von Guids (eigentlich diese ist eine weitere subquery). Ich möchte alle Entitäten filtern, bei denen mindestens eine GUID in der GUID-Liste enthalten 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 Kriterien API, das scheint unmöglich zu sein.

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

Wirft eine Ausnahme.

+0

die Ausnahme? – MatthieuGD

+0

und die Unterabfrage ist eine detachedcriteria? – MatthieuGD

+0

Ja, die Unterabfrage ist eine DetachedCriteria. Die Ausnahme ist, dass das Argument "Schlüssel" nicht null sein darf. Es scheint eine Ausnahme zu sein, wenn man auf ein Wörterbuch zugreift und nicht viel bedeutet. –

Antwort

1

Ihre Abfrage funktioniert nicht, da die an die Unterabfrage übergebene e.Guids-Eigenschaft kein einzelner Wert ist. Um dies zu tun, versuchen Sie tatsächlich, eine Kreuzung durchzuführen und zu überprüfen, dass diese Kreuzung nicht leer ist, was leider in den Kriterien api nicht existiert, obwohl Sie dies wahrscheinlich mit Linq machen könnten.

Sie könnten wahrscheinlich dies noch tun, wenn Ihr Guids mit den entsprechenden Eigenschaften Einheiten sind (die Value-Eigenschaft enthält den eigentlichen Guid) und gab es 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)); 
+0

Ich denke für das korrekte Verhalten müssen Sie die Methode Subqueries.PropertyIn() verwenden, die "Id" als Tabellenspalte verwendet (zB. Id in (select ...)). Unterabfragen.In() markieren Sie "Id" als Konstante (zB 'Id' in (select ...). –

Verwandte Themen