2012-09-14 31 views
8

QueryOver API'sini kullanarak NHibernate sorgusuna aşağıdaki LINQ'ı nasıl uygularım? Bu, DB'nin tüm Kayıtlarının bir listesini alır ve "İade Edilen" durumu olan Öğeleri listenin sonuna yerleştirir. Durum, veritabanındaki bir nvarchar ile eşlenen bir Enum'dir.QueryOver API OrderBy Kullanarak Durum

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

SQL eşdeğeri ben

ınvalidoperationexception

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

Ama şu olsun çalıştı Tabii ettik

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

geçerli: Değişken 'i' türündeki 'MyProject.Model.Entities.Item' '' Kapsamından başvurulan, ancak

Ben bu durumda diğer bazı işlevselliği ile yaşanan bir sorundan dolayı LINQ kullanamazsınız tanımlı değil.

cevap

13

yerine burada Projections.Conditional kullanarak ince olmalıdır:

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

Biraz ayrıntılı ama o işi olmalıdır.

+0

Harika çalışıyor olsa da Alias ​​bu durumda ne yapıyor? –

+2

Sadece "Restrictions.Where" aramasının içindeki tabloya başvurmanızı sağlar. İsterseniz, Restrictions.Where (i => i.Status == Status.Returned) seçeneğini de deneyebilirsiniz, ancak bu sürümde garip sonuçlar aldım. –

+0

Tam olarak ihtiyacım olan şey, teşekkürler. – iamserious