diff --git a/src/NHibernate.Test/NHSpecificTest/NH3377/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3377/Fixture.cs index 2a343c9baab..fe40f63ee6f 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH3377/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH3377/Fixture.cs @@ -28,6 +28,20 @@ protected override void OnSetUp() }; session.Save(e2); + var e3 = new Entity + { + Name = "True", + Age = "10" + }; + session.Save(e3); + + var e4 = new Entity + { + Name = "20141013", + Age = "11" + }; + session.Save(e4); + session.Flush(); transaction.Commit(); } @@ -71,5 +85,31 @@ public void ShouldBeAbleToCallConvertToInt32FromStringParameterInMax() Assert.AreEqual(17, result); } } + + [Test] + public void ShouldBeAbleToCallConvertToBooleanFromStringParameter() + { + //NH-3720 + using (ISession session = OpenSession()) + using (session.BeginTransaction()) + { + var result = session.Query().Where(x => x.Name == Boolean.TrueString).Select(x => Convert.ToBoolean(x.Name)).Single(); + + Assert.AreEqual(true, result); + } + } + + [Test] + public void ShouldBeAbleToCallConvertToDateTimeFromStringParameter() + { + //NH-3720 + using (ISession session = OpenSession()) + using (session.BeginTransaction()) + { + var result = session.Query().Where(x => x.Name == "20141013").Select(x => Convert.ToDateTime(x.Name)).Single(); + + Assert.AreEqual(new DateTime(2014, 10, 13), result); + } + } } } \ No newline at end of file diff --git a/src/NHibernate/Linq/Functions/ConvertGenerator.cs b/src/NHibernate/Linq/Functions/ConvertGenerator.cs index 0782fa11e75..c9e8e501f98 100644 --- a/src/NHibernate/Linq/Functions/ConvertGenerator.cs +++ b/src/NHibernate/Linq/Functions/ConvertGenerator.cs @@ -10,7 +10,42 @@ namespace NHibernate.Linq.Functions { - public class ConvertToInt32Generator : BaseHqlGeneratorForMethod + public abstract class ConvertToGenerator : BaseHqlGeneratorForMethod + { + public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor) + { + return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof(T)); + } + } + + //NH-3720 + public class ConvertToDateTimeGenerator : ConvertToGenerator + { + public ConvertToDateTimeGenerator() + { + SupportedMethods = new[] + { + ReflectionHelper.GetMethodDefinition(s => DateTime.Parse(s)), + ReflectionHelper.GetMethodDefinition(o => Convert.ToDateTime(o)) + }; + } + } + + //NH-3720 + public class ConvertToBooleanGenerator : ConvertToGenerator + { + public ConvertToBooleanGenerator() + { + SupportedMethods = new[] + { + ReflectionHelper.GetMethodDefinition(s => Boolean.Parse(s)), + ReflectionHelper.GetMethodDefinition(o => Convert.ToBoolean(o)) + }; + } + } + + + public class ConvertToInt32Generator : ConvertToGenerator { public ConvertToInt32Generator() { @@ -34,14 +69,9 @@ public ConvertToInt32Generator() ReflectionHelper.GetMethodDefinition(o => Convert.ToInt32(o)) }; } - - public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor) - { - return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof (int)); - } } - public class ConvertToDecimalGenerator : BaseHqlGeneratorForMethod + public class ConvertToDecimalGenerator : ConvertToGenerator { public ConvertToDecimalGenerator() { @@ -64,14 +94,9 @@ public ConvertToDecimalGenerator() ReflectionHelper.GetMethodDefinition(o => Convert.ToDecimal(o)) }; } - - public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor) - { - return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof(decimal)); - } } - public class ConvertToDoubleGenerator : BaseHqlGeneratorForMethod + public class ConvertToDoubleGenerator : ConvertToGenerator { public ConvertToDoubleGenerator() { @@ -94,10 +119,5 @@ public ConvertToDoubleGenerator() ReflectionHelper.GetMethodDefinition(o => Convert.ToDouble(o)) }; } - - public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor) - { - return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof(double)); - } } } diff --git a/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs b/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs index 816fef486b1..7baf31dc4a4 100644 --- a/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs +++ b/src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs @@ -25,6 +25,9 @@ public DefaultLinqToHqlGeneratorsRegistry() RegisterGenerator(new CompareGenerator()); this.Merge(new CompareGenerator()); + //NH-3720 + this.Merge(new ConvertToDateTimeGenerator()); + this.Merge(new ConvertToBooleanGenerator()); this.Merge(new ConvertToInt32Generator()); this.Merge(new ConvertToDecimalGenerator()); this.Merge(new ConvertToDoubleGenerator());