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);
}
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
@ user866293: są tam dwa przykłady, a pierwszy daje NHibernate.IQueryOver –
LeftyX
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