-
Notifications
You must be signed in to change notification settings - Fork 934
/
Copy pathLockExpressionNode.cs
41 lines (33 loc) · 1.5 KB
/
LockExpressionNode.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Linq.Expressions;
using Remotion.Linq.Clauses;
using Remotion.Linq.Clauses.Expressions;
using Remotion.Linq.Parsing.Structure.IntermediateModel;
namespace NHibernate.Linq
{
internal class LockExpressionNode : ResultOperatorExpressionNodeBase
{
private static readonly ParameterExpression Parameter = Expression.Parameter(typeof(object));
private readonly ConstantExpression _lockMode;
private readonly ResolvedExpressionCache<Expression> _cache;
public LockExpressionNode(MethodCallExpressionParseInfo parseInfo, ConstantExpression lockMode)
: base(parseInfo, null, null)
{
_lockMode = lockMode;
_cache = new ResolvedExpressionCache<Expression>(this);
}
public override Expression Resolve(ParameterExpression inputParameter, Expression expressionToBeResolved, ClauseGenerationContext clauseGenerationContext)
{
return Source.Resolve(inputParameter, expressionToBeResolved, clauseGenerationContext);
}
protected override ResultOperatorBase CreateResultOperator(ClauseGenerationContext clauseGenerationContext)
{
//Resolve identity expression (_=>_). Normally this would be resolved into QuerySourceReferenceExpression.
var expression = _cache.GetOrCreate(
r => r.GetResolvedExpression(Parameter, Parameter, clauseGenerationContext));
if (!(expression is QuerySourceReferenceExpression qsrExpression))
throw new NotSupportedException($"WithLock is not supported on {expression}");
return new LockResultOperator(qsrExpression, _lockMode);
}
}
}