2012-09-14 17 views
8

Jak wykonać następujące kwerendy LINQ do NHibernate za pomocą interfejsu API QueryOver. Otrzymuje to listę wszystkich rekordów pozycji z bazy danych i umieszcza elementy o statusie "zwrócone" na końcu listy. Status jest Enum, który jest mapowany do nvarchar w bazie danych.Zamówienie QueryOver API za pomocą Case

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

Odpowiednik SQL jest

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

mam oczywiście próbowano

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

Ale pojawia się następujący

InvalidOperationException: zmienna 'i' typu "MyProject.Model.Entities.Item" odniesienia z zakresu ", ale nie jest zdefiniowane

Nie mogę używać LINQ z powodu problemu z inną funkcją w tym przypadku.

Odpowiedz

13

powinno być w porządku za pomocą Projections.Conditional tutaj zamiast:

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

To trochę rozwlekły, ale powinien to zadanie.

+0

Działa świetnie, ale co robi Alias ​​w tym przypadku? –

+2

Po prostu umożliwia odwoływanie się do tabeli wewnątrz wywołania "Ograniczenia.". Możesz również wypróbować "Ograniczenia. Gdzie (i => i.Status == Status.Returned)' jeśli wolisz, ale miałem dziwne wyniki w tej wersji. –

+0

Dokładnie to, czego potrzebowałem, dzięki. – iamserious

Powiązane problemy