Обработка DateTime? в запросах NHibernate / LINQ - PullRequest
1 голос
/ 29 января 2011

это продолжение вопроса Better DateTime? или использовать значение по умолчанию (DateTime) для NULL?

Я попытался реализовать простой запрос, работающий с DateTime?, на другом примере, а не на другом вопросе.

В моем случае public virtual DateTime? Expiration свойство отображается как

<property name="Expiration" not-null="false" type="DateTime" />

Теперь мой запрос LINQ выглядит следующим образом

return (from product in session.Query<Product>()
                    where
                        !product.Hidden &&
                        (product.Expiration != null ||
                        (product.Expiration.Value - DateTime.Now).TotalDays < 5 && (product.Expiration.Value - DateTime.Now).TotalDays >= 0)
                    select product).ToList();

Запрос говорит: выберите все продукты, которые не скрыты и не истекают через 5 дней (<5 продуктов с истекшим сроком действия, поэтому я должен добавить вторую проверку) </p>

Я получаю исключение из ANTLR:

'Antlr.Runtime.NoViableAltException'. [.Where(NHibernate.Linq.NhQueryable`1[Model.Product], Quote((product, ) => (AndAlso(Not(product.Hidden), OrElse(DateTime.op_Inequality(product.Expiration, NULL), AndAlso(LessThan(DateTime.op_Subtraction(product.Expiration.Value, p2).TotalDays, p3), GreaterThanOrEqual(DateTime.op_Subtraction(product.Expiration.Value, p4).TotalDays, p5)))))), )] 

Как мне обработать DateTime? в NHibernate 3.0 с LINQ?

Ответы [ 5 ]

1 голос
/ 30 января 2011

Вы не можете сделать product.Expiration.Value - DateTime.Now, а также вы не можете сделать (product.Expiration.Value - DateTime.Now).TotalDays, потому что в nhibernate2linq нет поддержки этих функций (я не знаю, в Entity Framework вы можете использовать их canonical сущностные функции но я не знаю о nhibernate3, может быть, они их исправляют, только одна вещь, которую вы можете создать обертку для ваших действий:)

0 голосов
/ 26 февраля 2011

Hallo На самом деле я нашел мою проблему, которая, кажется, не связана с NHibernate Linq. Я запутался, потому что профилировщик Nhibernate показал следующий запрос, который должен быть выполнен на БД

and session2_.LCSE_END_DATE >= '26.02.YYYY 09:34:12' 
and session2_.LCSE_BEGIN_DATE <= '26.02.YYYY 09:34:12') 

Наконец, я полагаю, что это ошибка NhibernateProfiler.

0 голосов
/ 26 февраля 2011

У меня такая же проблема. Это часть моего запроса Linq over Nhibernate 3.0

.Where(c => c.EndDate.Value >= DateTime.Now && c.BeginDate.Value <= DateTime.Now)

То, что я узнал, это произведение превращается в

and session2_.LCSE_END_DATE >= '26.02.YYYY 09:34:12' 
and session2_.LCSE_BEGIN_DATE <= '26.02.YYYY 09:34:12') 

Кажется, что он не может правильно преобразовать DateTime.Now! Может быть ошибка ??

0 голосов
/ 09 февраля 2011

Попробуйте использовать переменные вместо прямого вызова DateTime.Это может быть причиной ошибки.

0 голосов
/ 29 января 2011

Было бы хорошо, если бы вы опубликовали фактическое исключение, но я предполагаю, что .TotalDays не сопоставляется с SQL.

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

...