如何将Skip和Take附加到nHibernate IQueryOver

时间:2011-07-30 20:14:43

标签: nhibernate queryover

我想这样做:

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

我无法在Skip或Take上找到任何帮助。工具提示帮助(是的,我是绝望的)说Skip和Take返回IQueryOver,但是错误信息说明了“无法隐式地将IQueryOver {T}转换为IQueryOver {T,T}。”我不知道IQueryOver是什么{T,T}是。无论如何,我没有要求其中一个。

1 个答案:

答案 0 :(得分:2)

尝试更改您的代码:

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

或者,甚至更好:

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

您可以查看我的代码here下载 NHibernateQueryOver

<强>更新

我觉得你错过了什么。我建议你阅读article这对我真有帮助 在关于关联的段落中,他们说:

  

IQueryOver有两种类型的兴趣;根类型(查询返回的实体类型),以及“当前”实体的类型   被查询。例如,以下查询使用联接来创建   sub-QueryOver(类似于在ICriteria中创建子标准   API):

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

JoinQueryOver返回IQueryOver的新实例   它是Kittens系列的根源。限制的默认类型   现在是小猫(限制在上面的'Tiddles'这个名字   例如),同时调用.List()将返回一个IList。类型   IQueryOver继承自IQueryOver。

当我想构建多个过滤器时,这就是我所做的:

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

方法:

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