Как установить максимальный результат возврата для многих к одному

У меня есть класс продукта, который имеет отношение один ко многим с классом цены. Таким образом, продукт может иметь несколько цен.

Мне нужно запросить в БД 10 товаров, у которых Price.amount <$ 2. В этом случае необходимо заполнить пользовательский интерфейс 10 элементами на странице. поэтому я пишу следующий код:

ICriteria criteria = session.CreateCriteria(typeof(Product));

criteria.SetFirstResult(pageNumber);
criteria.SetMaxResults(numberOfItemInPage);

criteria = criteria.CreateCriteria("PriceCollection");
criteria.Add(Restrictions.Le("Amount", new Decimal(2)));
criteria.SetResultTransformer(CriteriaSpecification.DistinctRootEntity);

Вместо того, чтобы получить 10 товаров в списке, я получаю меньше (т.е. 5). Причина в том, что SetMaxResults (10) возвращает мне 10 продуктов, но с дубликатами. Дубликаты затем удаляются с помощью SetResultTransformer (DistinctRootEntity).

Может кто-нибудь сказать мне, как я могу получить 10 уникальных продуктов без увеличения SetMaxResults ()? Мне нужно использовать pagenumber в качестве своего рода индексации.

15.12.2008 08:08:45
3 ОТВЕТА

Это будет зависеть от SQL, в зависимости от того, что происходит в методах, которые получают список, вам нужно изменить SQL так, чтобы он вел себя так, как вам нравится.

Но, будучи отличным, вы не должны получать дубликаты.

0
15.12.2008 08:19:13

Будет ли порядок утверждений иметь значение? Похоже, что он устанавливает максимальный счет рано, и отсеивание дубликатов в конце, которое применяется в таком порядке, может в итоге дать меньше, чем вы ограничивали, в соответствии с тем, что вы описали, происходит.

Я бы подумал, что вам нужно будет эффективно получить все результаты, затем применить ограничение (и, возможно, сортировку?) И отсеять дубликаты, а затем, наконец, применить ограничение по количеству страниц или страниц к ним, чтобы получить первые 10, следующие 10 , и так далее. Поэтому изменение порядка операторов в соответствии с этим логическим порядком может помочь исправить вашу ошибку.

-1
15.12.2008 09:09:53
Это было бы одно решение, но в случае большой таблицы, скажем, 1 миллион строк, это несколько повлияет на производительность.
gajah 15.12.2008 09:47:23
Применяете ли вы SetMaxResults в начале или в конце, не имеет значения. При выполнении он все равно будет переводиться в тот же SQL-запрос.
Daniel Schilling 28.09.2011 20:01:25

Кажется, ваша проблема дубликатов связана с тем, что вы объединяете две таблицы, и поэтому вы можете получать один и тот же продукт столько раз, сколько у вас есть цены на него.

Как насчет добавления 2 дополнительных столбцов в таблицу продуктов:

MinimumPrice (numeric(18,2)
MaximumPrice (numeric(18,2)

Всякий раз, когда ваша система изменяет цены на продукт, вы обновляете эти два поля в продукте. Теперь вы можете написать запрос SQL следующим образом:

SELECT TOP 10 * FROM Product
WHERE MinimumPrice > 2.0

И у вас не будет дублирующихся продуктов.

0
15.12.2008 10:25:42