【问题标题】:How do I append Skip and Take to an nHibernate IQueryOver如何将 Skip 和 Take 附加到 nHibernate IQueryOver
【发布时间】:2011-10-16 16:13:30
【问题描述】:

我想这样做:

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 and Take 返回 IQueryOver 但错误消息说明了“无法将 IQueryOver {T} 隐式转换为 IQueryOver {T,T}。我不知道 IQueryOver 是什么{T,T} 是。反正我没有要求其中之一。

【问题讨论】:

    标签: nhibernate queryover


    【解决方案1】:

    尝试像这样更改您的代码:

    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,这对我非常有帮助。
    在关于Associations的段落中,他们说:

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

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

    JoinQueryOver 返回一个新的 IQueryOver 实例,而不是 它的根源在于小猫系列。限制的默认类型 现在是小猫(限制在上面的名字 '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();
    

    更新-更新:

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

    【讨论】:

    • 感谢您的回复 Lefty - 但它没有给我一个 iqueryover{T} 对象。我不想要数据,我想要查询,并且我想要查询包括跳过/拍摄。再次感谢。
    • @user866293:那里有 2 个示例,第一个为您提供 NHibernate.IQueryOver
    • Lefty 很抱歉,但示例 1 无法编译。如果我删除 IQueryOver{T,T} 中的第二个 T,则 query = query.where(...) 行会给出错误消息。如果我留下第二个 T 行 query = query.Skip(...) 不会编译。我错过了使用声明吗?我有:使用 NHibernate;使用 NHibernate.Criterion;使用 NHibernate.Linq;
    • @Sam:确保您使用的是最新的 Nhibernate 版本之一。我正在使用 NHibernate 3.1.0.4000,它应该可以工作,除非有别的东西。
    • 我使用的是同一个版本:3.1.0.4000。您是否能够实际构建和运行类似的语句?我在家用/工作机器上遇到同样的错误。
    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    相关资源
    最近更新 更多