2012-09-14 19 views
8

Wie kann ich die folgende LINQ to NHibernate Abfrage mit der QueryOver API durchführen. Dies ruft eine Liste aller Datensätze von Artikel aus der DB ab und platziert Artikel mit dem Status "Zurückgegeben" an das Ende der Liste. Der Status ist eine Enum, die einem Nvarchar in der Datenbank zugeordnet ist.QueryOver API OrderBy mit Case

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

Die SQL-Äquivalent ist

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

ich natürlich habe

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

aber ich bekomme die folgende

InvalidOperationException: Variable 'i' vom Typ 'MyProject.Model.Entities.Item' mit Bezug auf den Anwendungsbereich ‚‘, aber es ist nicht

Ich kann nicht LINQ verwenden, da ein Problem mit einigen anderen Funktionen in diesem Fall definiert.

Antwort

13

sollten Sie sich gut Projections.Conditional mit hier statt:

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 ist ein wenig weitschweifig, aber es sollte den Job zu erledigen.

+0

Funktioniert gut, aber was macht die Alias ​​in diesem Fall? –

+2

Sie können nur die Tabelle innerhalb des Aufrufs "Restrictions.Where" referenzieren. Sie könnten auch 'Restrictions.Where (i => i.Status == Status.Returned)' versuchen, wenn Sie bevorzugen, aber ich hatte seltsame Ergebnisse mit dieser Version. –

+0

Genau das, was ich brauchte, danke. – iamserious