2012-09-14 74 views
8

¿Cómo puedo realizar el siguiente LINQ a la consulta NHibernate utilizando la API QueryOver. Esto obtiene una lista de todos los registros de elementos del DB y coloca los artículos con el estado "Devuelto" al final de la lista. El estado es un Enum que está mapeado a un nvarchar en la base de datos.Pedido API QueryOver utilizando el caso

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

El SQL es equivalente

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

he intentado por supuesto

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

pero me sale el siguiente

InvalidOperationException: la variable 'i' de tipo 'MyProject.Model.Entities.Item' referenciado desde alcance '', pero se no define

no puedo utilizar LINQ debido a un problema con alguna otra funcionalidad en este caso.

Respuesta

13

que debe estar bien utilizando Projections.Conditional aquí en su lugar:

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(); 

Es un poco prolijo pero debe hacer el trabajo.

+0

Funciona bien aunque, ¿qué hace el alias en este caso? –

+2

Simplemente le permite hacer referencia a la tabla dentro de la llamada 'Restrictions.Where'. También puede probar 'Restrictions.Where (i => i.Status == Status.Returned)' si lo prefiere, pero he tenido resultados extraños con esa versión. –

+0

Exactamente lo que necesitaba, gracias. – iamserious

Cuestiones relacionadas