Skip to content

Commit eb42fb2

Browse files
committed
NH-3579 - Fix leaking session in DefaultQueryProvider
1 parent 017cae1 commit eb42fb2

File tree

2 files changed

+9
-9
lines changed

2 files changed

+9
-9
lines changed

src/NHibernate.Test/Linq/ExpressionSessionLeakTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace NHibernate.Test.Linq
88
{
99
public class ExpressionSessionLeakTest : LinqTestCase
1010
{
11-
[Test, KnownBug("NH-3579")]
11+
[Test]
1212
public void SessionGetsCollected()
1313
{
1414
var reference = DoLinqInSeparateSession();

src/NHibernate/Linq/DefaultQueryProvider.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,17 @@ public class DefaultQueryProvider : INhQueryProvider
2020
{
2121
private static readonly MethodInfo CreateQueryMethodDefinition = ReflectionHelper.GetMethodDefinition((DefaultQueryProvider p) => p.CreateQuery<object>(null));
2222

23+
private readonly WeakReference _session;
24+
2325
public DefaultQueryProvider(ISessionImplementor session)
2426
{
25-
Session = session;
27+
_session = new WeakReference(session, true);
2628
}
2729

28-
protected virtual ISessionImplementor Session { get; private set; }
29-
30-
#region IQueryProvider Members
30+
protected virtual ISessionImplementor Session
31+
{
32+
get { return _session.Target as ISessionImplementor; }
33+
}
3134

3235
public virtual object Execute(Expression expression)
3336
{
@@ -47,16 +50,14 @@ public virtual IQueryable CreateQuery(Expression expression)
4750
{
4851
MethodInfo m = CreateQueryMethodDefinition.MakeGenericMethod(expression.Type.GetGenericArguments()[0]);
4952

50-
return (IQueryable) m.Invoke(this, new[] {expression});
53+
return (IQueryable) m.Invoke(this, new object[] {expression});
5154
}
5255

5356
public virtual IQueryable<T> CreateQuery<T>(Expression expression)
5457
{
5558
return new NhQueryable<T>(this, expression);
5659
}
5760

58-
#endregion
59-
6061
public virtual object ExecuteFuture(Expression expression)
6162
{
6263
IQuery query;
@@ -92,7 +93,6 @@ protected virtual object ExecuteFutureQuery(NhLinqExpression nhLinqExpression, I
9293

9394
object result = method.Invoke(query, new object[0]);
9495

95-
9696
if (nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer != null)
9797
{
9898
((IDelayedValue) result).ExecuteOnEval = nhQuery.ExpressionToHqlTranslationResults.PostExecuteTransformer;

0 commit comments

Comments
 (0)