2012-09-14 11 views
8

Come è possibile eseguire la seguente query LINQ su NHibernate utilizzando l'API QueryOver. Ciò ottiene un elenco di tutti i record di Item dal DB e posiziona gli articoli con lo stato "Restituito" alla fine dell'elenco. Lo stato è un Enum che viene mappato su un nvarchar nel database.Ordine API QueryOver utilizzando la custodia

var workList = session.Query<Item>() 
       .OrderBy(i=> i.Status == Status.Returned ? 1 : 0) 
       .ToList(); 

L'equivalente SQL è

SELECT * 
FROM Item 
ORDER BY case when Status='Returned' then 1 else 0 end 

ho naturalmente provato

var workList = session.QueryOver<Item>() 
       .OrderBy(i => i.Status == Status.Returned ? 1 : 0).Asc 
       .ToList(); 

ma ottengo il seguente

InvalidOperationException: variabile 'i' di tipo 'MyProject.Model.Entities.Item' riferimento dal campo di applicazione '', ma è non definito

non posso usare LINQ causa di un problema con qualche altra funzionalità in questo caso.

risposta

13

Si dovrebbe andare bene con Projections.Conditional qui invece:

Item itemAlias = null; 

var workList = 
    session.QueryOver<Item>(() => itemAlias) 
     .OrderBy(Projections.Conditional(
      Restrictions.Where(() => itemAlias.Status == Status.Returned), 
      Projections.Constant(1), 
      Projections.Constant(0))).Asc 
     .List(); 

E 'un po' prolisso, ma dovrebbe ottenere il lavoro fatto.

+0

Funziona benissimo anche se cosa fa l'alias in questo caso? –

+2

Permette solo di fare riferimento alla tabella all'interno della chiamata 'Restrictions.Where'. Potresti anche provare a 'Restrictions.Where (i => i.Status == Status.Returned)' se preferisci, ma ho avuto risultati strani con quella versione. –

+0

Esattamente quello di cui avevo bisogno, grazie. – iamserious

Problemi correlati