2010-04-08 12 views
5

vorrei ordinare il mio risultato in questo modo:Ordina per null/non nullo con ICriteria

  • prima voglio tutte le righe/oggetti in cui una colonna/proprietà non è nullo, poi tutti in cui la colmn/property è null.
  • Quindi voglio ordinare per un'altra colonna/proprietà.

Come posso fare questo con ICriteria? Devo creare la mia classe di ordine o può essere eseguita con il codice esistente?

ICriteria criteria = Session.CreateCriteria<MyClass>() 
    .AddOrder(Order.Desc("NullableProperty")) // What do I do here? IProjection? Custom Order class? 
    .AddOrder(Order.Asc("OtherProperty")); 

Mi piacerebbe avere un ordine come questo:

NullableProperty OtherProperty 
---------------- ------------- 
1     2 
8     7 
5     9 
NULL    1 
NULL    3 
NULL    8 

risposta

11

Ho finalmente una risposta operativa per questo. Non pensavo che fosse possibile prima (10k di possono vedere la mia risposta cancellati), ma ho iniziato con una query SQL:

SELECT Id, NullableProperty, OtherProperty 
    FROM NullableSorting 
    ORDER BY 
     (CASE WHEN NullableProperty IS NULL THEN 1 ELSE 0 END), 
     OtherProperty 

e poi convertito al utilizzando le interfacce criteri. Tutti gli oggetti usati qui sono integrati.

ICriteria criteria = 
    session.CreateCriteria(typeof(NullableEntity)) 
    .AddOrder 
    (
     Order.Asc 
     (
      Projections.Conditional 
      (
       Restrictions.IsNull("NullableProperty"), 
       Projections.Constant(1), 
       Projections.Constant(0) 
      ) 
     ) 
    ) 
    .AddOrder(Order.Asc("OtherProperty")); 
+0

Nel mio caso volevo i null ultimi, ma ancora ordinando da NullableProperty per i valori non nulli. Tuttavia, questa è una grande risposta che mi ha ottenuto il 99% del modo in cui ci sono. Per chiunque altro desideri la stessa cosa, basta aggiungere '.AddOrder (Order.Asc (" NullableProperty ")' dopo l'ordine del caso ma prima OtherProperty. –

0

non so nulla di ICriteria, ma qui è un pensiero. Puoi provare a utilizzare SQL personalizzato per il caricamento, in altre parole, un blocco <sql-query> nella mappatura che ti offre una colonna ordinabile. In Oracle sarebbe qualcosa del genere: