2011-07-30 14 views
6

chcę to zrobić:Jak mogę Dołącz Przejdź i Take do NHibernate IQueryOver

NHibernate.IQueryOver<DataAccess.Domain.Product, DataAccess.Domain.Product> query = session.QueryOver<DataAccess.Domain.Product>(); 
query = query.Where(x => x.Name == "X"); 
query = query.Take(1).Skip(3); 
List<Product> results = query.List().ToList(); 

nie mogę znaleźć żadnej pomocy na Przejdź lub podjąć. Pomoc z tooltipem (tak, jestem tak zrozpaczony) mówi, że Skip and Take zwraca IQueryOver, ale komunikat o błędzie mówi coś do skutku "Cant domyślnie konwertuje IQueryOver {T} na IQueryOver {T, T} .Nie wiem co IQueryOver {T, T} jest nie poprosić o jeden z tych, w każdym razie

Odpowiedz

2

spróbować zmienić swój kod tak:..

NHibernate.IQueryOver<DataAccess.Domain.Product> query = session.QueryOver<DataAccess.Domain.Product>(); 
query = query.Where(x => x.Name == "X"); 
query = query.Take(1).Skip(3); 
var results = query.List(); 

Albo jeszcze lepiej:

var results = session.QueryOver<DataAccess.Domain.Product>() 
     .Where(x => x.Name == "X") 
     .Take(1) 
     .Skip(3) 
     .List(); 

You mogę sprawdzić mój kod here pobieranie NHibernateQueryOver.

UPDATE:

myślę, że czegoś brakuje. Sugeruję, aby przeczytać ten article, który był bardzo pomocny dla mnie.
W akapicie o stowarzyszenia mówią:

IQueryOver posiada dwa rodzaje zainteresowania; typ root (typ obiektu zwracanego przez zapytanie) oraz sprawdzany typ "bieżącej" encji . Na przykład, po zapytaniu występuje sprzężenie tworzyć podpotok QueryOver (analogiczna do tworzenia podkryteria w ICriteria API):

IQueryOver<Cat,Kitten> catQuery = 
    session.QueryOver<Cat>() 
     .JoinQueryOver(c => c.Kittens) 
      .Where(k => k.Name == "Tiddles"); 

JoinQueryOver zwraca nową instancję IQueryOver niż ma jego korzeń w kolekcji Kocięta. Domyślnym typem ograniczeń jest teraz Kociak (ograniczając nazwę "Tiddles" w powyższym przykładzie ), podczas wywoływania .List() zwróci IList. Typ IQueryOver dziedziczy z IQueryOver.

To co mam zrobić, gdy chcę zbudować wielokrotnego filtr:

Domain.OrderAddress addressDestination = null; 
Domain.Customer customer = null; 
Domain.TermsConditionsOfSale termsConditionsOfSale = null; 

ICriterion filter1 = Restrictions.Where<Domain.Order>(t => t.Company == "MYCOMPANY"); 
ICriterion filter2 = Restrictions.Where<Domain.Order>(t => t.WareHouseDelivery == "DEPXX"); 
ICriterion filter3 = Restrictions.Where<Domain.Order>(t => t.Status == "X"); 
ICriterion filter4 = Restrictions.Where(() => addressDestination.AddressType == "99"); 
ICriterion filter5 = Restrictions.Where(() => addressDestination.Province.IsIn(new string[] { "AA", "BB", "CC" })); 
ICriterion filter6 = Restrictions.Where(() => termsConditionsOfSale.ReturnedGoodsCode != "01"); 

var ordersForProvinces = session.QueryOver<Domain.Order>() 
    .Inner.JoinAlias(t => t.OrderAddresses,() => addressDestination) 
     .Inner.JoinAlias(t => t.Customer,() => customer) 
     .Left.JoinAlias(t => t.TermsConditionsOfSale,() => termsConditionsOfSale); 

ordersForProvinces 
    .Where(filter1) 
     .And(filter2) 
     .And(filter3) 
     .And(filter4) 
     .And(filter5) 
     .And(filter6); 

var Results = ordersForProvinces.Skip(50).Take(20).List(); 

UPDATE-UPDATE:

NHibernate.IQueryOver<Domain.Person> person = session.QueryOver<Domain.Person>(); 
var myList = DoSomething(person); 

Metoda:

private static IList<Domain.Person> DoSomething(NHibernate.IQueryOver<Domain.Person> persons) 
{ 
    ICriterion filter1 = Restrictions.Where<Domain.Person>(t => t.CompanyName.IsLike("Customer%")); 

    persons.RootCriteria.Add(filter1); 
    var x = persons.Skip(1).Take(3).List(); 
    return (x); 
} 
+0

Dziękuję za twoja odpowiedź Lefty - ale nie daje mi to nic dziwnego ryover {T} object. Nie chcę danych, chcę zapytania i chcę, aby zapytanie zawierało pominięcie/pobranie. Dzięki jeszcze raz. – Sam

+0

@ user866293: są tam dwa przykłady, a pierwszy daje NHibernate.IQueryOver LeftyX

+0

Lefty Przepraszam, ale przykład 1 nie kompiluję. Jeśli usunę drugie T w IQueryOver {T, T}, zapytanie liniowe = query.where (...) daje komunikat o błędzie. Jeśli opuszczę drugie T, zapytanie liniowe = query.Skip (...) nie zostanie skompilowane. Czy brakuje mi używania instrukcji? Mam: przy użyciu NHibernate; przy użyciu NHibernate.Criterion; za pomocą NHibernate.Linq; – Sam