Skip to content

Commit 11507b1

Browse files
committed
Add Linq parameter type detection
1 parent 3a2941d commit 11507b1

33 files changed

+1340
-244
lines changed

src/NHibernate.DomainModel/Northwind/Entities/User.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,16 @@ public class User : IUser, IEntity
4848

4949
public virtual FeatureSet Features { get; set; }
5050

51+
public virtual User NotMappedUser => this;
52+
5153
public virtual EnumStoredAsString Enum1 { get; set; }
5254

55+
public virtual EnumStoredAsString? NullableEnum1 { get; set; }
56+
5357
public virtual EnumStoredAsInt32 Enum2 { get; set; }
5458

59+
public virtual EnumStoredAsInt32? NullableEnum2 { get; set; }
60+
5561
public virtual IUser CreatedBy { get; set; }
5662

5763
public virtual IUser ModifiedBy { get; set; }

src/NHibernate.DomainModel/Northwind/Mappings/User.hbm.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,14 @@
2424
<column name="Enum1" length="12" />
2525
</property>
2626

27+
<property name="NullableEnum1" type="NHibernate.DomainModel.Northwind.Entities.EnumStoredAsStringType, NHibernate.DomainModel"
28+
formula="(case when Enum1 = 'Unspecified' then null else Enum1 end)" insert="false" update="false">
29+
</property>
30+
2731
<property name="Enum2" not-null="true" />
2832

33+
<property name="NullableEnum2" formula="(case when Enum2 = 0 then null else Enum2 end)" insert="false" update="false" />
34+
2935
<property name="Features" not-null="true" />
3036

3137
<many-to-one name="Role" class="Role">

src/NHibernate.Test/Async/Linq/EnumTests.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,42 @@ public async Task CanQueryOnEnumStoredAsString_Small_1Async()
6161

6262
Assert.AreEqual(expectedCount, query.Count);
6363
}
64+
65+
[Test]
66+
public async Task ConditionalNavigationPropertyAsync()
67+
{
68+
EnumStoredAsString? type = null;
69+
await (db.Users.Where(o => o.Enum1 == EnumStoredAsString.Large).ToListAsync());
70+
await (db.Users.Where(o => EnumStoredAsString.Large != o.Enum1).ToListAsync());
71+
await (db.Users.Where(o => (o.NullableEnum1 ?? EnumStoredAsString.Large) == EnumStoredAsString.Medium).ToListAsync());
72+
await (db.Users.Where(o => ((o.NullableEnum1 ?? type) ?? o.Enum1) == EnumStoredAsString.Medium).ToListAsync());
73+
74+
await (db.Users.Where(o => (o.NullableEnum1.HasValue ? o.Enum1 : EnumStoredAsString.Unspecified) == EnumStoredAsString.Medium).ToListAsync());
75+
await (db.Users.Where(o => (o.Enum1 != EnumStoredAsString.Large
76+
? (o.NullableEnum1.HasValue ? o.Enum1 : EnumStoredAsString.Unspecified)
77+
: EnumStoredAsString.Small) == EnumStoredAsString.Medium).ToListAsync());
78+
79+
await (db.Users.Where(o => (o.Enum1 == EnumStoredAsString.Large ? o.Role : o.Role).Name == "test").ToListAsync());
80+
}
81+
82+
[Test]
83+
public async Task CanQueryComplexExpressionOnEnumStoredAsStringAsync()
84+
{
85+
var type = EnumStoredAsString.Unspecified;
86+
var query = await ((from user in db.Users
87+
where (user.NullableEnum1 == EnumStoredAsString.Large
88+
? EnumStoredAsString.Medium
89+
: user.NullableEnum1 ?? user.Enum1
90+
) == type
91+
select new
92+
{
93+
user,
94+
simple = user.Enum1,
95+
condition = user.Enum1 == EnumStoredAsString.Large ? EnumStoredAsString.Medium : user.Enum1,
96+
coalesce = user.NullableEnum1 ?? EnumStoredAsString.Medium
97+
}).ToListAsync());
98+
99+
Assert.That(query.Count, Is.EqualTo(0));
100+
}
64101
}
65102
}

src/NHibernate.Test/Linq/ConstantTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,12 +217,12 @@ public void ConstantInWhereDoesNotCauseManyKeys()
217217
select c);
218218
var preTransformParameters = new PreTransformationParameters(QueryMode.Select, Sfi);
219219
var preTransformResult = NhRelinqQueryParser.PreTransform(q1.Expression, preTransformParameters);
220-
var expression = ExpressionParameterVisitor.Visit(preTransformResult, out var parameters1);
221-
var k1 = ExpressionKeyVisitor.Visit(expression, parameters1);
220+
var parameters1 = ExpressionParameterVisitor.Visit(preTransformResult);
221+
var k1 = ExpressionKeyVisitor.Visit(preTransformResult.Expression, parameters1, Sfi);
222222

223223
var preTransformResult2 = NhRelinqQueryParser.PreTransform(q1.Expression, preTransformParameters);
224-
var expression2 = ExpressionParameterVisitor.Visit(preTransformResult2, out var parameters2);
225-
var k2 = ExpressionKeyVisitor.Visit(expression2, parameters2);
224+
var parameters2 = ExpressionParameterVisitor.Visit(preTransformResult2);
225+
var k2 = ExpressionKeyVisitor.Visit(preTransformResult2.Expression, parameters2, Sfi);
226226

227227
Assert.That(parameters1, Has.Count.GreaterThan(0), "parameters1");
228228
Assert.That(parameters2, Has.Count.GreaterThan(0), "parameters2");

0 commit comments

Comments
 (0)