Skip to content

Commit 5b395e5

Browse files
committed
Merge pull request #356 from rjperes/NH-3720
NH-3720
2 parents cf354f8 + fb9b16a commit 5b395e5

File tree

3 files changed

+81
-18
lines changed

3 files changed

+81
-18
lines changed

src/NHibernate.Test/NHSpecificTest/NH3377/Fixture.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@ protected override void OnSetUp()
2828
};
2929
session.Save(e2);
3030

31+
var e3 = new Entity
32+
{
33+
Name = "True",
34+
Age = "10"
35+
};
36+
session.Save(e3);
37+
38+
var e4 = new Entity
39+
{
40+
Name = "20141013",
41+
Age = "11"
42+
};
43+
session.Save(e4);
44+
3145
session.Flush();
3246
transaction.Commit();
3347
}
@@ -71,5 +85,31 @@ public void ShouldBeAbleToCallConvertToInt32FromStringParameterInMax()
7185
Assert.AreEqual(17, result);
7286
}
7387
}
88+
89+
[Test]
90+
public void ShouldBeAbleToCallConvertToBooleanFromStringParameter()
91+
{
92+
//NH-3720
93+
using (ISession session = OpenSession())
94+
using (session.BeginTransaction())
95+
{
96+
var result = session.Query<Entity>().Where(x => x.Name == Boolean.TrueString).Select(x => Convert.ToBoolean(x.Name)).Single();
97+
98+
Assert.AreEqual(true, result);
99+
}
100+
}
101+
102+
[Test]
103+
public void ShouldBeAbleToCallConvertToDateTimeFromStringParameter()
104+
{
105+
//NH-3720
106+
using (ISession session = OpenSession())
107+
using (session.BeginTransaction())
108+
{
109+
var result = session.Query<Entity>().Where(x => x.Name == "20141013").Select(x => Convert.ToDateTime(x.Name)).Single();
110+
111+
Assert.AreEqual(new DateTime(2014, 10, 13), result);
112+
}
113+
}
74114
}
75115
}

src/NHibernate/Linq/Functions/ConvertGenerator.cs

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,42 @@
1010

1111
namespace NHibernate.Linq.Functions
1212
{
13-
public class ConvertToInt32Generator : BaseHqlGeneratorForMethod
13+
public abstract class ConvertToGenerator<T> : BaseHqlGeneratorForMethod
14+
{
15+
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
16+
{
17+
return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof(T));
18+
}
19+
}
20+
21+
//NH-3720
22+
public class ConvertToDateTimeGenerator : ConvertToGenerator<DateTime>
23+
{
24+
public ConvertToDateTimeGenerator()
25+
{
26+
SupportedMethods = new[]
27+
{
28+
ReflectionHelper.GetMethodDefinition<string>(s => DateTime.Parse(s)),
29+
ReflectionHelper.GetMethodDefinition<string>(o => Convert.ToDateTime(o))
30+
};
31+
}
32+
}
33+
34+
//NH-3720
35+
public class ConvertToBooleanGenerator : ConvertToGenerator<Boolean>
36+
{
37+
public ConvertToBooleanGenerator()
38+
{
39+
SupportedMethods = new[]
40+
{
41+
ReflectionHelper.GetMethodDefinition<string>(s => Boolean.Parse(s)),
42+
ReflectionHelper.GetMethodDefinition<string>(o => Convert.ToBoolean(o))
43+
};
44+
}
45+
}
46+
47+
48+
public class ConvertToInt32Generator : ConvertToGenerator<int>
1449
{
1550
public ConvertToInt32Generator()
1651
{
@@ -34,14 +69,9 @@ public ConvertToInt32Generator()
3469
ReflectionHelper.GetMethodDefinition<ushort>(o => Convert.ToInt32(o))
3570
};
3671
}
37-
38-
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
39-
{
40-
return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof (int));
41-
}
4272
}
4373

44-
public class ConvertToDecimalGenerator : BaseHqlGeneratorForMethod
74+
public class ConvertToDecimalGenerator : ConvertToGenerator<decimal>
4575
{
4676
public ConvertToDecimalGenerator()
4777
{
@@ -64,14 +94,9 @@ public ConvertToDecimalGenerator()
6494
ReflectionHelper.GetMethodDefinition<ushort>(o => Convert.ToDecimal(o))
6595
};
6696
}
67-
68-
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
69-
{
70-
return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof(decimal));
71-
}
7297
}
7398

74-
public class ConvertToDoubleGenerator : BaseHqlGeneratorForMethod
99+
public class ConvertToDoubleGenerator : ConvertToGenerator<double>
75100
{
76101
public ConvertToDoubleGenerator()
77102
{
@@ -94,10 +119,5 @@ public ConvertToDoubleGenerator()
94119
ReflectionHelper.GetMethodDefinition<ushort>(o => Convert.ToDouble(o))
95120
};
96121
}
97-
98-
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
99-
{
100-
return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof(double));
101-
}
102122
}
103123
}

src/NHibernate/Linq/Functions/DefaultLinqToHqlGeneratorsRegistry.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ public DefaultLinqToHqlGeneratorsRegistry()
2525
RegisterGenerator(new CompareGenerator());
2626
this.Merge(new CompareGenerator());
2727

28+
//NH-3720
29+
this.Merge(new ConvertToDateTimeGenerator());
30+
this.Merge(new ConvertToBooleanGenerator());
2831
this.Merge(new ConvertToInt32Generator());
2932
this.Merge(new ConvertToDecimalGenerator());
3033
this.Merge(new ConvertToDoubleGenerator());

0 commit comments

Comments
 (0)