Как добавить Skip and Take в nHibernate IQueryOver - PullRequest
6 голосов
/ 31 июля 2011

Я хочу сделать это:

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 and Take возвращают IQueryOver, но в сообщении об ошибке что-то говорится об этом: «Не могу неявно преобразовать IQueryOver {T} в IQueryOver {T, T}. Я не знаю, что такое IQueryOver»{T, T}, я все равно не просил об этом.

1 Ответ

2 голосов
/ 31 июля 2011

Попробуйте изменить код следующим образом:

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

Вы можете проверить мой код здесь загрузка NHibernateQueryOver .

UPDATE:

Я думаю, что вы что-то упустили. Я бы предложил вам прочитать эту статью , которая была очень полезна для меня.
В абзаце о ассоциациях говорится:

IQueryOver имеет два типа интереса; корневой тип (тип объекта, который возвращает запрос), и тип «текущего» объекта запрашивается. Например, следующий запрос использует соединение для создания подзапрос (аналогично созданию подкритериев в ICriteria API):

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

JoinQueryOver возвращает новый экземпляр IQueryOver, чем имеет его корень в коллекции котят. Тип по умолчанию для ограничений в настоящее время котенок (ограничение на имя «Тидлс» в приведенном выше пример), при вызове .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);
}
...