Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I append Skip and Take to an nHibernate IQueryOver

I want to do this:

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

I cant find any help on Skip or Take. The tooltip help (yes I'm that desperate) says that Skip and Take return IQueryOver but the error message says something to the effect "Cant implicitly convert IQueryOver{T} to IQueryOver{T,T}. I don't know what IQueryOver{T,T} is. I didn't ask for one of those anyway.

like image 235
Sam Avatar asked Jul 30 '11 20:07

Sam


1 Answers

Try to change your code like this:

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

Or, even better:

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

You can check my code here downloading NHibernateQueryOver.

UPDATE:

I think you're missing something. I would suggest you to read this article which has been really helpful for me.
In the paragraph about Associations they say:

An IQueryOver has two types of interest; the root type (the type of entity that the query returns), and the type of the 'current' entity being queried. For example, the following query uses a join to create a sub-QueryOver (analagous to creating sub-criteria in the ICriteria API):

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

The JoinQueryOver returns a new instance of the IQueryOver than has its root at the Kittens collection. The default type for restrictions is now Kitten (restricting on the name 'Tiddles' in the above example), while calling .List() will return an IList. The type IQueryOver inherits from IQueryOver.

This is what I do when I want to build multiple filter:

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

Method:

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);
}
like image 183
LeftyX Avatar answered Oct 09 '22 13:10

LeftyX