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.

Reply via email to