2016-05-18 2 views
3

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.

Antwort

2

Ich glaube, du bist nur ein .Id auf order in Ihrer where-Klausel fehlt:

Order order = null; 

var query = session.QueryOver<Customer>() 
    .Left.JoinAlias(x => x.Orders,() => order) 
    .Where(x => x.Active) 
    .And(() => order.Id == null || (order.date >= date1 && order.date <= date2)) 
// -----------------^ 

Das gibt mir die folgende SQL (SQL Server):

SELECT 
    this_.Name as y0_, 
    order1_.Id as y1_ 
FROM 
    Customer this_ 
    LEFT OUTER JOIN [Order] order1_ ON this_.Id = order1_.CustomerId 
WHERE 
    this_.Active = @p0 AND (
     order1_.Id IS NULL OR (
      order1_.Date >= @p1 AND order1_.Date <= @p2 
     ) 
    ); 
+0

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). –

+2

@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. –

Verwandte Themen