Mein aktuelles Projekt verwendet NHibernate 3.0b1 und die API. Ich bin ziemlich flüssig in LINQ, aber ich habe absolut keine Erfahrung mit HQL oder der ICriteria API. Eine meiner Abfragen wird von der IQueryable-API nicht unterstützt. Daher nehme ich an, dass ich eine der vorherigen APIs verwenden muss - aber ich habe keine Ahnung, wo ich anfangen soll.Wie kann ich diese LINQ-Abfrage mithilfe der NHibernate ICriteria API ausdrücken?
Ich habe versucht, im Internet nach einem guten "Erste Schritte" Leitfaden für ICriteria zu suchen, aber die einzigen Beispiele, die ich gefunden habe, sind entweder viel zu einfach, um hier anzuwenden oder viel zu weit fortgeschritten für mich zu verstehen. Wenn jemand gute Lernmaterialien mitbringt, wäre es sehr zu schätzen.
Auf jeden Fall habe ich die Abfrage bin das Objektmodell wie dieses gegen aussieht (stark vereinfacht, nicht-relevanten Eigenschaften weggelassen):
class Ticket {
IEnumerable<TicketAction> Actions { get; set; }
}
abstract class TicketAction {
Person TakenBy { get; set; }
DateTime Timestamp { get; set; }
}
class CreateAction : TicketAction {}
class Person {
string Name { get; set; }
}
A Ticket
hat eine Sammlung von TicketAction
seiner Geschichte beschreibt. TicketAction
Untertypen gehören CreateAction
, ReassignAction
, CloseAction
, etc. Alle Tickets haben eine CreateAction
zu dieser Sammlung hinzugefügt, wenn erstellt.
Diese LINQ-Abfrage sucht nach Tickets, die von jemandem mit dem angegebenen Namen erstellt wurden.
var createdByName = "john".ToUpper();
var tickets = _session.Query<Ticket>()
.Where(t => t.Actions
.OfType<CreateAction>()
.Any(a => a.TakenBy.Name.ToUpper().Contains(createdByName));
Die OfType<T>()
Methode verursacht eine NotSupportedException
geworfen werden. Kann ich dies stattdessen mit ICriteria tun?
Ich würde lieber keinen Rückverweis auf ein hinzufügen müssen 'TicketAction's' Ticket' wenn ich helfen kann da das andere Probleme mit sich bringen wird, aber danke für den Tipp. :) –
Die andere Art, wie wir Situationen wie diese behandelt haben, war, die HQL in einem String Builder zu erstellen. Wir haben versucht, Linq zu Nhibernate-Ausdrücken zu verwenden, aber auch diese unterstützen keine Sammlungen, wenn die Sammlung auf der Objektseite ist. Leider übersetzt die Methode "Contains" nicht in Linq in nHibernate. – Josh
Ich ging schließlich mit Ihrem Vorschlag (Hinzufügen eines Verweises auf das Ticket auf TicketAction), aber ich am Ende mit einem Fehler: "NHibernate.QueryException: Eigenschaft konnte nicht aufgelöst werden: TakenBy.Name von: CreateAction " –