This code wasn't changed. It's in Dutch, JaarEnMaand means YearAndMonth
from my previous snippets...
Model, LINQ and generated where statement is below C# code
using System;
> using System.Globalization;
> namespace Model
> {
> /// <summary>
> /// Een combinatie van een jaar en een maand.
> /// </summary>
> [Serializable]
> public struct JaarEnMaand : IComparable, IComparable<JaarEnMaand>,
> IEquatable<JaarEnMaand>, IFormattable
> {
> #region Constructors
> /// <summary>
> /// Initialiseert een nieuwe instantie van de <see
> cref="JaarEnMaand"/> class met de opgegeven <paramref name="jaar"/> en
> <paramref name="maand"/>.
> /// </summary>
> /// <param name="jaar">Het jaar, tussen 1 en 9999.</param>
> /// <param name="maand">De maand, tussen 1 en 12.</param>
> /// <exception cref="ArgumentOutOfRangeException"><paramref
> name="jaar"/> is kleiner dan 1 of groter dan 9999.</exception>
> /// <exception cref="ArgumentOutOfRangeException"><paramref
> name="maand"/> is kleiner dan 1 of groter dan 12.</exception>
> public JaarEnMaand(int jaar, int maand)
> {
> if (jaar < 1 || jaar > 9999)
> {
> throw new ArgumentOutOfRangeException("jaar");
> }
> if (maand < 1 || maand > 12)
> {
> throw new ArgumentOutOfRangeException("maand");
> }
> _jaar = jaar;
> _maand = maand;
> }
> /// <summary>
> /// Initialiseert een nieuwe instantie van de <see
> cref="JaarEnMaand"/> class op basis van de opgegeven <paramref
> name="datum"/>.
> /// </summary>
> /// <param name="datum">De datum waarvan het jaar en de maand
> gebruikt worden.</param>
> public JaarEnMaand(DateTime datum)
> {
> _jaar = datum.Year;
> _maand = datum.Month;
> }
> #endregion
> #region Properties
> private int _maand;
> /// <summary>
> /// De maand, tussen 1 en 12.
> /// </summary>
> public int Maand
> {
> get
> {
> if (_maand == 0)
> {
> _maand = 1;
> }
> return _maand;
> }
> private set // voor NHibernate
> {
> if (value < 1 || value > 12)
> {
> throw new ArgumentOutOfRangeException("value");
> }
> _maand = value;
> }
> }
> private int _jaar;
> /// <summary>
> /// Het jaar, tussen 1 en 9999.
> /// </summary>
> public int Jaar
> {
> get
> {
> if (_jaar == 0)
> {
> _jaar = 1;
> }
> return _jaar;
> }
> private set // voor NHibernate
> {
> if (value < 1 || value > 9999)
> {
> throw new ArgumentOutOfRangeException("value");
> }
> _jaar = value;
> }
> }
> /// <summary>
> /// De kleinst mogelijke waarde voor <see cref="JaarEnMaand"/>.
> /// </summary>
> public static readonly JaarEnMaand MinValue = new JaarEnMaand(1,
> 1);
> /// <summary>
> /// De grootst mogelijke waarde voor <see cref="JaarEnMaand"/>.
> /// </summary>
> public static readonly JaarEnMaand MaxValue = new
> JaarEnMaand(9999, 12);
> #endregion
> #region Operators
> /// <summary>
> /// Bepaalt of twee instanties van <see cref="JaarEnMaand"/>
> gelijk zijn.
> /// </summary>
> /// <param name="jaarEnMaand1">Een <see
> cref="JaarEnMaand"/>.</param>
> /// <param name="jaarEnMaand2">Een <see
> cref="JaarEnMaand"/>.</param>
> /// <returns><see langword="true"/> als <paramref
> name="jaarEnMaand1"/> en <paramref name="jaarEnMaand2"/> gelijk zijn, of
> <see langword="false"/> als ze ongelijk zijn.</returns>
> public static bool operator ==(JaarEnMaand jaarEnMaand1,
> JaarEnMaand jaarEnMaand2)
> {
> return jaarEnMaand1.Jaar == jaarEnMaand2.Jaar &&
> jaarEnMaand1.Maand == jaarEnMaand2.Maand;
> }
> /// <summary>
> /// Bepaalt of twee instanties van <see cref="JaarEnMaand"/>
> ongelijk zijn.
> /// </summary>
> /// <param name="jaarEnMaand1">Een <see
> cref="JaarEnMaand"/>.</param>
> /// <param name="jaarEnMaand2">Een <see
> cref="JaarEnMaand"/>.</param>
> /// <returns><see langword="true"/> als <paramref
> name="jaarEnMaand1"/> en <paramref name="jaarEnMaand2"/> ongelijk zijn, of
> <see langword="false"/> als ze gelijk zijn.</returns>
> public static bool operator !=(JaarEnMaand jaarEnMaand1,
> JaarEnMaand jaarEnMaand2)
> {
> return jaarEnMaand1.Jaar != jaarEnMaand2.Jaar ||
> jaarEnMaand1.Maand != jaarEnMaand2.Maand;
> }
> /// <summary>
> /// Bepaalt of de ene <see cref="JaarEnMaand"/> groter is dan de
> andere <see cref="JaarEnMaand"/>.
> /// </summary>
> /// <param name="jaarEnMaand1">Een <see
> cref="JaarEnMaand"/>.</param>
> /// <param name="jaarEnMaand2">Een <see
> cref="JaarEnMaand"/>.</param>
> /// <returns><see langword="true"/> als <paramref
> name="jaarEnMaand1"/> groter is dan <paramref name="jaarEnMaand2"/>, of
> anders <see langword="false"/>.</returns>
> public static bool operator >(JaarEnMaand jaarEnMaand1,
> JaarEnMaand jaarEnMaand2)
> {
> if (jaarEnMaand1.Jaar == jaarEnMaand2.Jaar)
> {
> return (jaarEnMaand1.Maand > jaarEnMaand2.Maand);
> }
> return (jaarEnMaand1.Jaar > jaarEnMaand2.Jaar);
> }
> /// <summary>
> /// Bepaalt of de ene <see cref="JaarEnMaand"/> groter is dan of
> gelijk is aan de andere <see cref="JaarEnMaand"/>.
> /// </summary>
> /// <param name="jaarEnMaand1">Een <see
> cref="JaarEnMaand"/>.</param>
> /// <param name="jaarEnMaand2">Een <see
> cref="JaarEnMaand"/>.</param>
> /// <returns><see langword="true"/> als <paramref
> name="jaarEnMaand1"/> groter is dan of gelijk is aan <paramref
> name="jaarEnMaand2"/>, of anders <see langword="false"/>.</returns>
> public static bool operator >=(JaarEnMaand jaarEnMaand1,
> JaarEnMaand jaarEnMaand2)
> {
> if (jaarEnMaand1.Jaar == jaarEnMaand2.Jaar)
> {
> return (jaarEnMaand1.Maand >= jaarEnMaand2.Maand);
> }
> return (jaarEnMaand1.Jaar >= jaarEnMaand2.Jaar);
> }
> /// <summary>
> /// Bepaalt of de ene <see cref="JaarEnMaand"/> kleiner is dan de
> andere <see cref="JaarEnMaand"/>.
> /// </summary>
> /// <param name="jaarEnMaand1">Een <see
> cref="JaarEnMaand"/>.</param>
> /// <param name="jaarEnMaand2">Een <see
> cref="JaarEnMaand"/>.</param>
> /// <returns><see langword="true"/> als <paramref
> name="jaarEnMaand1"/> kleiner is dan <paramref name="jaarEnMaand2"/>, of
> anders <see langword="false"/>.</returns>
> public static bool operator <(JaarEnMaand jaarEnMaand1,
> JaarEnMaand jaarEnMaand2)
> {
> if (jaarEnMaand1.Jaar == jaarEnMaand2.Jaar)
> {
> return (jaarEnMaand1.Maand < jaarEnMaand2.Maand);
> }
> return (jaarEnMaand1.Jaar < jaarEnMaand2.Jaar);
> }
> /// <summary>
> /// Bepaalt of de ene <see cref="JaarEnMaand"/> kleiner is dan of
> gelijk is aan de andere <see cref="JaarEnMaand"/>.
> /// </summary>
> /// <param name="jaarEnMaand1">Een <see
> cref="JaarEnMaand"/>.</param>
> /// <param name="jaarEnMaand2">Een <see
> cref="JaarEnMaand"/>.</param>
> /// <returns><see langword="true"/> als <paramref
> name="jaarEnMaand1"/> kleiner is dan of gelijk is aan <paramref
> name="jaarEnMaand2"/>, of anders <see langword="false"/>.</returns>
> public static bool operator <=(JaarEnMaand jaarEnMaand1,
> JaarEnMaand jaarEnMaand2)
> {
> if (jaarEnMaand1.Jaar == jaarEnMaand2.Jaar)
> {
> return (jaarEnMaand1.Maand <= jaarEnMaand2.Maand);
> }
> return (jaarEnMaand1.Jaar <= jaarEnMaand2.Jaar);
> }
> #endregion
> #region Methods
> /// <summary>
> /// Converteert de waarde van dit object naar een string.
> /// </summary>
> /// <returns>De string waarde voor dit object.</returns>
> public override string ToString()
> {
> return String.Format(CultureInfo.InvariantCulture, "{0}-{1}",
> Maand, Jaar);
> }
> /// <summary>
> /// Formatteert de waarde van deze <see cref="JaarEnMaand"/> als
> een string.
> /// Deze gebruikt dezelfde formatteer opties als <see
> cref="DateTime"/>, voor de dag en de tijdsdelen worden default waardes
> gebruikt.
> /// </summary>
> /// <param name="format">Het formaat, of <see langword="null"/> om
> het default formaat te gebruiken.</param>
> /// <param name="formatProvider">De <see cref="IFormatProvider"/>
> die gebruikt wordt om de waarde te formatteren.</param>
> /// <returns>De geformatteerde waarde voor dit object.</returns>
> public string ToString(string format, IFormatProvider
> formatProvider)
> {
> if (format == null)
> {
> return ToString();
> }
> return ToDate(1).ToString(format, formatProvider);
> }
> /// <summary>
> /// Geeft de hash code voor dit object.
> /// </summary>
> /// <returns>Een hash code.</returns>
> public override int GetHashCode()
> {
> return Maand.GetHashCode() ^ Jaar.GetHashCode();
> }
> /// <summary>
> /// Geeft aan of het huidige object gelijk is aan een ander object.
> /// </summary>
> /// <param name="obj">Een object om te vergelijken met het huidige
> object.</param>
> /// <returns><see langword="true"/> als het andere object gelijk
> is aan het huidige object, of <see langword="false"/> als ze ongelijk
> zijn.</returns>
> public override bool Equals(object obj)
> {
> if (obj == null)
> {
> return false;
> }
> if (!(obj is JaarEnMaand))
> {
> return false;
> }
> return Equals((JaarEnMaand) obj);
> }
> /// <summary>
> /// Geeft aan of het huidige object gelijk is aan een ander object
> van hetzelfde type.
> /// </summary>
> /// <param name="other">Een object om te vergelijken met het
> huidige object.</param>
> /// <returns><see langword="true"/> als het andere object gelijk
> is aan het huidige object, of <see langword="false"/> als ze ongelijk
> zijn.</returns>
> public bool Equals(JaarEnMaand other)
> {
> return this == other;
> }
> /// <summary>
> /// Vergelijkt het huidige object met een ander object van
> hetzelfde type.
> /// </summary>
> /// <param name="other">Een object om te vergelijken met het
> huidige object.</param>
> /// <returns></returns>
> public int CompareTo(JaarEnMaand other)
> {
> if (this < other)
> {
> return -1;
> }
> if (this > other)
> {
> return 1;
> }
> return 0;
> }
> /// <summary>
> /// Vergelijkt het huidige object met een ander object van
> hetzelfde type.
> /// </summary>
> /// <param name="obj">Een object om te vergelijken met het huidige
> object.</param>
> /// <returns>Een waarde die aangeeft of het andere object groter
> dan, kleiner dan, of gelijk aan het huidge object is.</returns>
> public int CompareTo(object obj)
> {
> if (obj == null)
> {
> return 1;
> }
> if (!(obj is JaarEnMaand))
> {
> throw new ArgumentException("Parameter is geen
> JaarEnMaand.", "obj");
> }
> return CompareTo((JaarEnMaand) obj);
> }
> /// <summary>
> /// Converteert deze <see cref="JaarEnMaand"/> en de opgegeven
> <paramref name="dag"/> tot een datum.
> /// </summary>
> /// <param name="dag">De dag.</param>
> /// <returns>de satum.</returns>
> /// <exception cref="ArgumentOutOfRangeException"><paramref
> name="dag"/> is kleiner dan 1 of groter dan het aantal dagen in de
> maand.</exception>
> public DateTime ToDate(int dag)
> {
> return new DateTime(Jaar, Maand, dag);
> }
> /// <summary>
> /// Telt het opgegeven <paramref name="aantalMaanden"/> op bij de
> huidige <see cref="JaarEnMaand"/>
> /// </summary>
> /// <param name="aantalMaanden">Het aantal maanden dat moet worden
> opgeteld bij de <see cref="JaarEnMaand"/>.</param>
> /// <returns>Een <see cref="JaarEnMaand"/>.</returns>
> public JaarEnMaand Add(int aantalMaanden)
> {
> return this + aantalMaanden;
> }
> /// <summary>
> /// Trekt het opgegeven <paramref name="aantalMaanden"/> af van de
> huidige <see cref="JaarEnMaand"/>
> /// </summary>
> /// <param name="aantalMaanden">Het aantal maanden dat moet worden
> afgetrokken van de <see cref="JaarEnMaand"/>.</param>
> /// <returns>Een <see cref="JaarEnMaand"/>.</returns>
> public JaarEnMaand Subtract(int aantalMaanden)
> {
> return this - aantalMaanden;
> }
> #endregion
> }
> }
*Model:*
> public class AsapInput : Entity{
public virtual JaarEnMaand AsapVerwerkingsPeriode { get; set; }
> }
>
*LINQ statement:*
> .Where(ai => ai.AsapVerwerkingsPeriode >= periodeVanaf
> && ai.AsapVerwerkingsPeriode <= periodeTm && ( //niet geblokkeerde
> beschikbaarstellingen en premie inhoudingen
> (ai.Type == AsapInputType.Beschikbaarstelling ||
> ai.Type == AsapInputType.BrutoPremieInhouding || ai.Type ==
> AsapInputType.NettoPremieInhouding) &&
> ai.Uitkeringscomponent.Bron !=
> UitkeringscomponentBron.HandmatigplanUC));
.Where(ai => ai.Uitkeringsplan.Contractnummer ==
> contract || ai.Uitkeringsplan.Contractnummer == contract.PadLeft(20, '0'))
*INCORRECT *Generated SQL where statement in *NHibernate 4.0.4.400*:
> WHERE (
> asapinput0_.asapverwerkingsperiodemaand ge
> @p0
> AND asapinput0_.asapverwerkingsperiodejaar ge
> @p1)
> AND (
> asapinput0_.asapverwerkingsperiodemaand le
> @p2
> AND asapinput0_.asapverwerkingsperiodejaar le
> @p3)
> AND (
> asapinput0_.type=@p4
> OR asapinput0_.type=@p5
> OR asapinput0_.type=@p6)
> AND uitkerings1_.bron<>@p7
> AND (
> uitkerings2_.klantnummer=@p8
> OR uitkerings2_.klantnummer=@p9)
*CORRECT* Generated SQL where statment in *NHibernate 2.1.2.400*:
> WHERE ((
>
> this_.asapverwerkingsperiodemaand >= @p0
> AND
> this_.asapverwerkingsperiodejaar >= @p1
> AND
> this_.asapverwerkingsperiodemaand <= @p2
> AND
> this_.asapverwerkingsperiodejaar <= @p3)
> AND (((
>
> this_.type = @p4
> OR
> this_.type = @p5)
> OR this_.type
> = @p6)
> AND NOT (
>
> uitkerings1_.bron = @p7)))
> AND (
> uitkerings2_.klantnummer = @p8
> OR uitkerings2_.klantnummer = @p9)
Kind regards
Erik
On Monday, April 18, 2016 at 12:44:09 PM UTC+2, Oskar Berggren wrote:
>
> Can you show an operator (with generated SQL) that was correct in 2.1 and
> wrong in 4.0?
>
> /Oskar
>
> 2016-04-18 11:06 GMT+01:00 Erik H <[email protected] <javascript:>>:
>
>> Thanks for the quick reply!
>>
>> Good spot regarding > operator, but there are several operators
>> implemented, I didn't put them all in this post. Implemented operators:
>> ==, !=, >, >=, <, <=, +, -
>>
>> Are there any options you see that I can do to get it back working?
>>
>>
>> On Monday, April 18, 2016 at 11:55:29 AM UTC+2, Oskar Berggren wrote:
>>>
>>> I don't think these operators have ever been supported on multi-column
>>> user types. Note that the behaviour you show for 2.1.2.400 also doesn't
>>> match the implementation in your operator>().
>>>
>>> /Oskar
>>>
>>> 2016-04-18 7:56 GMT+01:00 Erik H <[email protected]>:
>>>
>>>> I've got an struct that implements some operators.
>>>>
>>>> public struct YearAndMonth{
>>>>> private int _month;
>>>>> /// <summary>
>>>>> /// Month, between 1 and 12.
>>>>> /// </summary>
>>>>> public int Month
>>>>> {
>>>>> get
>>>>> {
>>>>> if (_month == 0)
>>>>> {
>>>>> _month = 1;
>>>>> }
>>>>> return _month;
>>>>> }
>>>>> private set // for NHibernate
>>>>> {
>>>>> if (value < 1 || value > 12)
>>>>> {
>>>>> throw new ArgumentOutOfRangeException("value");
>>>>> }
>>>>> _month = value;
>>>>> }
>>>>> }
>>>>> private int _year;
>>>>> /// <summary>
>>>>> /// Year, between 1 and 9999.
>>>>> /// </summary>
>>>>> public int Year
>>>>> {
>>>>> get
>>>>> {
>>>>> if (_year == 0)
>>>>> {
>>>>> _year = 1;
>>>>> }
>>>>> return _year;
>>>>> }
>>>>> private set // for NHibernate
>>>>> {
>>>>> if (value < 1 || value > 9999)
>>>>> {
>>>>> throw new ArgumentOutOfRangeException("value");
>>>>> }
>>>>> _year = value;
>>>>> }
>>>>> }
>>>>>
>>>> // This is just one of the operators, others are implemented
>>>>> too!!
>>>>
>>>> public static bool operator >(YearAndMonth obj1, YearAndMonth
>>>>> obj2)
>>>>> {
>>>>> if (obj1.Year == obj2.Year )
>>>>> {
>>>>> return (obj1.Month > obj2.Month);
>>>>> }
>>>>> return (obj1.Year > obj2.Year);
>>>>> }
>>>>> }
>>>>
>>>>
>>>> My class looks a bit like this:
>>>>
>>>> class MyObj {
>>>>> public YearAndMonth Period {get; set;}
>>>>> }
>>>>
>>>>
>>>> I've got a where statement like this:
>>>>
>>>> .Where(_ => _.Period >= startPeriod && _.Period <= endPeriod)
>>>>
>>>>
>>>> When NHibernate translates the where statement it generates strange
>>>> SQL and throws a GenericADOException:
>>>>
>>>> WHERE (
>>>>> myobj0_.periodmonth ge @p0
>>>>> AND myobj0_.periodyear ge @p1)
>>>>> AND (
>>>>> myobj0_.periodmonth le @p2
>>>>> AND myobj0_.periodyear le @p3)
>>>>
>>>>
>>>> How can I get my where statement working without modifying the Linq
>>>> statements? I've upgraded NHibernate from version 2.1.2.400 to
>>>> 4.0.4.400
>>>>
>>>>
>>>> Where statement that is produced by NHibernate 2.1.2.400 with
>>>> NHibernate.Linq
>>>> 1.1.0.1001:
>>>>
>>>>>
>>>>> WHERE (
>>>>> this_.periodmonth >=
>>>>> @p0
>>>>> AND this_.periodyear >=
>>>>> @p1
>>>>> AND this_.periodmonth <=
>>>>> @p2
>>>>> AND this_.periodyear <=
>>>>> @p3)
>>>>
>>>>
>>>> The configured dialect is NHibernate.Dialect.MsSql2008Dialect and
>>>> driver_class is NHibernate.Driver.SqlClientDriver.
>>>>
>>>> How can I make NHibernate generate the 'old' >= and <= ??
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "nhusers" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> To post to this group, send email to [email protected].
>>>> Visit this group at https://groups.google.com/group/nhusers.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>> --
>> You received this message because you are subscribed to the Google Groups
>> "nhusers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected]
>> <javascript:>.
>> Visit this group at https://groups.google.com/group/nhusers.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
--
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.