Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> NHibernate, сложные условия отбора 
:(
    Опции темы
fvoice
Дата 19.7.2010, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 28.4.2009

Репутация: нет
Всего: нет



Приветствую всех,

проект ASP.NET с ипользованием orm NHibernate 1.2.1.

Нужно реализовать запрос с использованием ICriteriion, аналог следующего SQL:
Код

select * from contracts
where createddate < (CAST(MONTH(createddate) as nvarchar) + '.25.2010')

т.е. выбрать все контракты дата создания которых меньше 25 числа месяца создания

понятно что просто вставить строковый литерал "(CAST(MONTH(createddate) as nvarchar) + '.25.2010')" для сравнения с полем CreatedDate нельзя, хибернейт пытается кастовать его к DateTime, и валится..

вариант с использованием ISQLQuery мною рассмотрен, он конечно реализуем, но хотелось бы узнать, может можно решить задачу с использованием условий для ICriteriion?
PM MAIL   Вверх
fvoice
Дата 19.7.2010, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 28.4.2009

Репутация: нет
Всего: нет



Напрашивается решение с 12 условиями, типа:
Код

where 
..
(createddate < '06.25.2010' and createddate between '06.01.2010' and '06.30.2010') or
(createddate < '05.25.2010' and createddate between '05.01.2010' and '05.31.2010') or
..


наверное так и сделаю, потому что на ICriterion реализован механизм навешивания условий сортировки, пейджинга и фильтрации.. реализация подобного для ISQLQuery, займет гораздо больше сил.
PM MAIL   Вверх
emmanuil
Дата 20.7.2010, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



А просто проверить день нельзя?
Ведь по условию, все контракты меньше 25 числа.
Код

DAY(CreatedDate) < 25

PM MAIL   Вверх
fvoice
Дата 20.7.2010, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 28.4.2009

Репутация: нет
Всего: нет



извините ошибся в описании, 
правильное условие такое:

Код

where CreatedDate > (CAST(MONTH(BeginDate) as nvarchar) + '.25.2010')


т.е. нужно выбрать только записи, созданные позже 25 числа месяца в котором начинает действовать контракт

основная проблема этого условия что его нельзя(или я не знаю как) описать в NHibernate критерии из-за наличия в нем функций SQL сервера, которые выполняются для каждой записи уже в момент выполнения запроса. В вашем примере функция DAY это тоже функция SQL сервера, поэтому также не может быть использована..

предложенный мною вариант(уже реализованный) с 12 условиями типа:
Код

(createddate > '05.25.2010' and createddate between '05.01.2010' and '05.31.2010')

хоть и достаточно громоздок, но позволяет выполнить запрос средствами критерии
PM MAIL   Вверх
1stain
Дата 20.7.2010, 16:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 5
Всего: 40



во-первых, можно добавить в класс отдельное свойство для дня, в мэпинге которого использовать формулу с применением выражений sql.

во-вторых, можно использовать в критерии Expression.Sql

и в-третьих если повторить 12 раз для каждого месяца
Код

(createddate > '05.25.2010' and createddate between '05.01.2010' and '05.31.2010')

то это то же самое, что написать 

Цитата(emmanuil @  20.7.2010,  11:27 Найти цитируемый пост)

Код

DAY(CreatedDate) > 25







--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
fvoice
Дата 21.7.2010, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 28.4.2009

Репутация: нет
Всего: нет



Да, вы правы, этот кусок условия тоже не верный, но в хибернетовских выражениях я построил правильно.. 

"Expression.Sql" 100% то что мне нужно, спасибо большое, попробовал, работает!

жалко не могу поднять вам репутацию, 100 постов требуется

Это сообщение отредактировал(а) fvoice - 21.7.2010, 07:04
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0521 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.