Nach einigen Stunden auf der Suche nach der Antwort fehlgeschlagen. Vielleicht ist es zu einfach und niemand hat darüber geredet, vielleicht habe ich nicht die richtigen Begriffe benutzt, um zu suchen.nHibernate QueryOver mit einem Links Join mit * ODER * und * AND * Klauseln
Grundsätzlich muss ich OR und AND-Klausel für eine LINKE JOIN-Tabelle verwenden. Und ich möchte das in einem QueryOver tun. Das resultierende SQL sollte wie folgt aussehen:
SELECT customer.name, order.id
FROM customer
LEFT JOIN order ON (order.idcustomer = customer.id)
WHERE customer.active
AND (order.id IS NULL or (order.date >= :p0 AND order.date <= :p1)
Wich bedeutet, werden alle aktiven Kunden und ihre Aufträge, sondern nur diejenigen, die noch nie einen Auftrag oder denen, die Aufträge zwischen einer bestimmten Periode haben.
Die meisten in der Nähe dieses ich in QueryOver bekam, war:
Order order = null;
var query = session.QueryOver<Customer>()
.Left.JoinAlias(x => x.Orders,() => order)
.Where(x => x.Active)
.And(() => order == null || (order.date >= date1 && order.date <= date2))
Die obigen QueryOver, bevor noch ausgeführt wird, gibt mir 'Reference nicht gesetzt'. Ich habe die Anweisungen zur Verwendung von 'Restrictions' gefunden, aber keine (oder zumindest keine, die meiner eingeschränkten Meinung klar sind) mit OR und AND togheter.
Ich schätze jede Hilfe.
Yeah! Es klappt! Ich habe das schon mal probiert, aber da der C# -Compiler immer sagt "order.Id == null" wird immer falsch sein, weil "Id" lang ist, dachte ich, ich würde nicht funktionieren (und es nicht versuchen). –
@RogerKühl: Ahh, das macht Sinn. Glücklicherweise werden die von QueryOver verwendeten Ausdrücke zur Laufzeit nicht ausgewertet, sie werden nur analysiert und schließlich in SQL umgewandelt, so dass diese Warnungen hier ignoriert werden können. –