NHibernate QueryOver Unterabfrage

Habe ich mir angeschaut, die ähnliche Fragen, aber nicht finden können, eine einfache Erklärung. Hätte ich es verpasst, aber ich verspreche, dass ich sah. Eigentlich kann ich nicht einmal finden Sie in der Dokumentation andere als einen einzelnen blog-post, die Glossen über alles, was schnell und davon ausgegangen, dass Sie vertraut sind mit anderen Formen von NH.

Gegeben, eine viele-zu-viele-zwischen Program und Topic, wo die letztere ist in eine Hierarchie von Topics möchte ich abrufen alle Programs für einen bestimmten Topic, möglicherweise einschließlich seiner Unterthemen. Da kann ein Programm aufgeführt werden, unter mehreren sub-Themen von einem bestimmten übergeordneten Thema, ich brauche eine Unterabfrage verwenden, oder deal mit, dass Sie eindeutige (und der einfache Ansatz von TransformUsing(Transformers.DistinctRootEntity) hat nicht funktioniert).

Raw-SQL sollte so etwas wie

SELECT ProgramId, Title, bar, baz, foo FROM Programs 
WHERE ProgramId IN 
 (SELECT ProgramId from Program_Topics WHERE TopicId IN (1, 2, ...))

Die Ergebnisse geworfen werden, in eine Modell-Typ für die übertragung an den view. Mein Erster Versuch war dieser:

ProgramDTO pDTO = null;

/* topicIds is List<int> passed into function */

var query = Session.QueryOver<Program>()
.JoinQueryOver<Topic>(p => p.Topics)
.WhereRestrictionOn(pt => pt.Id).IsInG<int>(topicIds)     
.TransformUsing(Transformers.DistinctRootEntity)
.SelectList(list => list
        .Select(program => program.Id).WithAlias(() => pDTO.Id)
        .Select(program => program.Title).WithAlias(() => pDTO.Title)
        .Select(program => program.Location).WithAlias(() => pDTO.Location)
        .Select(program => program.Description).WithAlias(() => pDTO.Description)
)
.TransformUsing(Transformers.AliasToBean(typeof(ProgramDTO)));

return query.List<ProgramDTO>();    

Offensichtlich läuft ein join statt Unterabfrage, aber ich kann nicht finden, ein Beispiel für eine Unterabfrage mit einer viele-zu-viele-wie diese.

public class Program : Entity {
    public virtual ISet<Topic> Topics { get; protected internal set; }
     ...
}

public class Topic : Entity {
    public virtual ISet<Program> Programs { get; protected internal set; }
    public virtual Topic ParentTopic { get; protected internal set; }
    ...
}
InformationsquelleAutor Carl Bussema | 2012-02-14
Schreibe einen Kommentar