Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions src/NHibernate.Test/NHSpecificTest/NH3377/Fixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down Expand Up @@ -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<Entity>().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<Entity>().Where(x => x.Name == "20141013").Select(x => Convert.ToDateTime(x.Name)).Single();

Assert.AreEqual(new DateTime(2014, 10, 13), result);
}
}
}
}
56 changes: 38 additions & 18 deletions src/NHibernate/Linq/Functions/ConvertGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,42 @@

namespace NHibernate.Linq.Functions
{
public class ConvertToInt32Generator : BaseHqlGeneratorForMethod
public abstract class ConvertToGenerator<T> : BaseHqlGeneratorForMethod
{
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof(T));
}
}

//NH-3720
public class ConvertToDateTimeGenerator : ConvertToGenerator<DateTime>
{
public ConvertToDateTimeGenerator()
{
SupportedMethods = new[]
{
ReflectionHelper.GetMethodDefinition<string>(s => DateTime.Parse(s)),
ReflectionHelper.GetMethodDefinition<string>(o => Convert.ToDateTime(o))
};
}
}

//NH-3720
public class ConvertToBooleanGenerator : ConvertToGenerator<Boolean>
{
public ConvertToBooleanGenerator()
{
SupportedMethods = new[]
{
ReflectionHelper.GetMethodDefinition<string>(s => Boolean.Parse(s)),
ReflectionHelper.GetMethodDefinition<string>(o => Convert.ToBoolean(o))
};
}
}


public class ConvertToInt32Generator : ConvertToGenerator<int>
{
public ConvertToInt32Generator()
{
Expand All @@ -34,14 +69,9 @@ public ConvertToInt32Generator()
ReflectionHelper.GetMethodDefinition<ushort>(o => Convert.ToInt32(o))
};
}

public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof (int));
}
}

public class ConvertToDecimalGenerator : BaseHqlGeneratorForMethod
public class ConvertToDecimalGenerator : ConvertToGenerator<decimal>
{
public ConvertToDecimalGenerator()
{
Expand All @@ -64,14 +94,9 @@ public ConvertToDecimalGenerator()
ReflectionHelper.GetMethodDefinition<ushort>(o => Convert.ToDecimal(o))
};
}

public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof(decimal));
}
}

public class ConvertToDoubleGenerator : BaseHqlGeneratorForMethod
public class ConvertToDoubleGenerator : ConvertToGenerator<double>
{
public ConvertToDoubleGenerator()
{
Expand All @@ -94,10 +119,5 @@ public ConvertToDoubleGenerator()
ReflectionHelper.GetMethodDefinition<ushort>(o => Convert.ToDouble(o))
};
}

public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof(double));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down