Как NHibernate Projection.Max работает с пустой таблицей? - PullRequest
6 голосов
/ 14 июля 2010

Я пытаюсь получить максимальное значение целочисленного поля в таблице.В частности, я пытаюсь автоматически увеличить поле «InvoiceNumber» при добавлении нового счета.Однако я не хочу, чтобы это было поле автоинкремента в базе данных, поскольку оно контролируется пользователем - я просто пытаюсь позаботиться о случае по умолчанию.Сейчас я использую

session.CreateCriteria<Invoice>()
        .SetProjection(Projections.Max("InvoiceNumber"))
        .FutureValue<int>();

, чтобы получить самый большой номер счета в базе данных.Это прекрасно работает, за исключением случаев, когда в базе данных уже нет счетов.Затем я получаю System.ArgumentException: значение "" не относится к типу "System.Int32" и не может использоваться в этой универсальной коллекции.Изменение на FutureValue<int?>() не решило проблему.Есть ли способ сказать NHibernate, чтобы сопоставить пустую строку с нулем?Или есть лучший способ для достижения моей цели в целом?

Трассировка стека исключения (по крайней мере, соответствующей части) -

NHibernate.HibernateException: Error executing multi criteria : [SELECT max(this_.[InvoiceNumber]) as y0_ FROM dbo.[tblInvoice] this_;
SELECT this_.ID as ID647_0_, this_.[NHVersion] as column2_647_0_, this_.[Description] as column3_647_0_, this_.[DiscountPercent] as column4_647_0_, this_.[DiscountDateDays] as column5_647_0_, this_.[PaymentDueDateDays] as column6_647_0_, this_.[Notes] as column7_647_0_, this_.[DiscountDateMonths] as column8_647_0_, this_.[PaymentDueDateMonths] as column9_647_0_, this_.[DiscountDatePeriod] as column10_647_0_, this_.[DiscountDateMonthlyDay] as column11_647_0_, this_.[DiscountDateMonthlyDayDay] as column12_647_0_, this_.[DiscountDateMonthlyDayMonth] as column13_647_0_, this_.[DiscountDateMonthlyThe] as column14_647_0_, this_.[DiscountDateMonthlyTheDOW] as column15_647_0_, this_.[DiscountDateMonthlyTheMonth] as column16_647_0_, this_.[DiscountDateMonthlyTheWeek] as column17_647_0_, this_.[PaymentDueDatePeriod] as column18_647_0_, this_.[PaymentDueDateMonthlyDay] as column19_647_0_, this_.[PaymentDueDateMonthlyDayDay] as column20_647_0_, this_.[PaymentDueDateMonthlyDayMonth] as column21_647_0_, this_.[PaymentDueDateMonthlyThe] as column22_647_0_, this_.[PaymentDueDateMonthlyTheDOW] as column23_647_0_, this_.[PaymentDueDateMonthlyTheMonth] as column24_647_0_, this_.[PaymentDueDateMonthlyTheWeek] as column25_647_0_ FROM dbo.[tblTermsCode] this_;
] ---> System.ArgumentException: The value "" is not of type "System.Int32" and cannot be used in this generic collection.
Parameter name: value
   at System.ThrowHelper.ThrowWrongValueTypeArgumentException(Object value, Type targetType)
   at System.Collections.Generic.List`1.VerifyValueType(Object value)
   at System.Collections.Generic.List`1.System.Collections.IList.Add(Object item)
   at NHibernate.Impl.MultiCriteriaImpl.GetResultsFromDatabase(IList results)

Ответы [ 2 ]

3 голосов
/ 14 июля 2010

use ... .UniqueValue<int?>();

NH использует неуниверсальный IList в своей реализации MultiCriteria.Который используется для дозирования FutureValue.см. здесь , почему List<int?> не может добавить ноль через реализацию IList.Я удивлен, что никогда не сталкивался с этим раньше.Избегайте использования типов значений, допускающих обнуляемость, с Future или MultiCriteria.

1 голос
/ 28 сентября 2011

С API QueryOver:

Session.QueryOver<T>()
      .Select(Projections.Max<Statistic>(s => s.PeriodStart))
      .SingleOrDefault<object>();

если ничего не возвращается, его значение равно нулю, в противном случае приведите результат к числовому

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...