Skip to content

Commit d6a7e84

Browse files
committed
Update TryGetEntityName method
1 parent 614c990 commit d6a7e84

File tree

3 files changed

+28
-38
lines changed

3 files changed

+28
-38
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,18 @@ public async Task CanSelectConditionalSubQueryAsync()
409409
})
410410
.ToListAsync());
411411
Assert.That(list3, Has.Count.GreaterThan(0));
412+
413+
var list4 = await (db.Orders
414+
.Select(o => new
415+
{
416+
Employee = db.Employees.Any(e => e.Superior != null)
417+
? db.Employees
418+
.Where(e => e.Superior != null)
419+
.Select(e => e.Superior).FirstOrDefault()
420+
: o.Employee.Superior != null ? o.Employee.Superior : o.Employee
421+
})
422+
.ToListAsync());
423+
Assert.That(list4, Has.Count.GreaterThan(0));
412424
}
413425

414426
[Test, KnownBug("NH-3045")]

src/NHibernate.Test/Linq/SelectionTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,18 @@ public void CanSelectConditionalSubQuery()
438438
})
439439
.ToList();
440440
Assert.That(list3, Has.Count.GreaterThan(0));
441+
442+
var list4 = db.Orders
443+
.Select(o => new
444+
{
445+
Employee = db.Employees.Any(e => e.Superior != null)
446+
? db.Employees
447+
.Where(e => e.Superior != null)
448+
.Select(e => e.Superior).FirstOrDefault()
449+
: o.Employee.Superior != null ? o.Employee.Superior : o.Employee
450+
})
451+
.ToList();
452+
Assert.That(list4, Has.Count.GreaterThan(0));
441453
}
442454

443455
[Test, KnownBug("NH-3045")]

src/NHibernate/Linq/Visitors/SelectClauseNominator.cs

Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using NHibernate.Persister.Entity;
99
using NHibernate.Type;
1010
using Remotion.Linq.Clauses.Expressions;
11+
using NHibernate.Util;
1112

1213
namespace NHibernate.Linq.Visitors
1314
{
@@ -172,7 +173,7 @@ private bool CanBeEvaluatedInHql(MemberExpression memberExpression)
172173
}
173174

174175
// Check whether the member is mapped
175-
var entityName = TryGetEntityName(memberExpression, out var memberPath);
176+
var entityName = ExpressionsHelper.TryGetEntityName(_parameters.SessionFactory, memberExpression, out var memberPath);
176177
if (entityName == null)
177178
{
178179
return false; // Not mapped
@@ -207,9 +208,9 @@ private bool CanBeEvaluatedInHql(BinaryExpression binaryExpression)
207208
var canBeEvaluated = CanBeEvaluatedInHql(binaryExpression.Left) &
208209
CanBeEvaluatedInHql(binaryExpression.Right);
209210

210-
// Subtract datetimes on the client side as its result varies when executed on the server side.
211+
// Subtract datetimes on the client side as the result varies when executed on the server side.
211212
// In Sql Server when using datetime2 subtract is not possbile.
212-
// In Oracle a number is returned that represents the difference bewteen the two in days.
213+
// In Oracle a number is returned that represents the difference between the two in days.
213214
if (new[]
214215
{
215216
ExpressionType.Subtract,
@@ -316,41 +317,6 @@ private void VisitMemberBindings(IEnumerable<MemberBinding> bindings)
316317
}
317318
}
318319

319-
private string TryGetEntityName(MemberExpression memberExpression, out string memberPath)
320-
{
321-
System.Type entityType;
322-
memberPath = memberExpression.Member.Name;
323-
// When having components we need to go though them in order to find the entity
324-
while (memberExpression.Expression is MemberExpression subMemberExpression)
325-
{
326-
// In some cases we can encounter a property representing the entity e.g. [_0].Customer.CustomerId
327-
if (subMemberExpression.NodeType == ExpressionType.MemberAccess)
328-
{
329-
var entityName = _parameters.SessionFactory.TryGetGuessEntityName(memberExpression.Member.ReflectedType);
330-
if (entityName != null)
331-
{
332-
return entityName;
333-
}
334-
}
335-
336-
memberPath = $"{subMemberExpression.Member.Name}.{memberPath}"; // Build a path that can be used to get the property form the entity metadata
337-
memberExpression = subMemberExpression;
338-
}
339-
340-
// Try to get the actual entity type from the query source if possbile as member can be declared
341-
// in a base type
342-
if (memberExpression.Expression is QuerySourceReferenceExpression querySourceReferenceExpression)
343-
{
344-
entityType = querySourceReferenceExpression.Type;
345-
}
346-
else
347-
{
348-
entityType = memberExpression.Member.ReflectedType;
349-
}
350-
351-
return _parameters.SessionFactory.TryGetGuessEntityName(entityType);
352-
}
353-
354320
private static bool ContainsAnyOfTypes(IEnumerable<Expression> expressions, params System.Type[] types)
355321
{
356322
return expressions.Any(o => types.Contains(o.Type));

0 commit comments

Comments
 (0)