Skip to content

Commit 1519a1d

Browse files
hazzikfredericDelaporte
authored andcommitted
NH-3488 - Remove code duplication in DML queries
1 parent be382ae commit 1519a1d

9 files changed

+36
-96
lines changed

src/NHibernate/Linq/DefaultQueryProvider.cs

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ public interface INhQueryProvider : IQueryProvider
1616
IEnumerable<TResult> ExecuteFuture<TResult>(Expression expression);
1717
IFutureValue<TResult> ExecuteFutureValue<TResult>(Expression expression);
1818
void SetResultTransformerAndAdditionalCriteria(IQuery query, NhLinqExpression nhExpression, IDictionary<string, Tuple<object, IType>> parameters);
19-
int ExecuteDelete<T>(Expression predicate);
20-
int ExecuteUpdate<T>(Expression expression, bool versioned);
21-
int ExecuteInsert<T>(Expression expression);
19+
int ExecuteDml<T>(QueryMode queryMode, Expression expression);
2220
}
2321

2422
public class DefaultQueryProvider : INhQueryProvider
@@ -174,31 +172,9 @@ public virtual void SetResultTransformerAndAdditionalCriteria(IQuery query, NhLi
174172
}
175173
}
176174

177-
public int ExecuteDelete<T>(Expression predicate)
175+
public int ExecuteDml<T>(QueryMode queryMode, Expression expression)
178176
{
179-
var nhLinqExpression = new NhLinqDeleteExpression(predicate, Session.Factory);
180-
181-
var query = Session.CreateQuery(nhLinqExpression);
182-
183-
SetParameters(query, nhLinqExpression.ParameterValuesByName);
184-
185-
return query.ExecuteUpdate();
186-
}
187-
188-
public int ExecuteUpdate<T>(Expression expression, bool versioned)
189-
{
190-
var nhLinqExpression = new NhLinqUpdateExpression<T>(Session.Factory, expression, versioned);
191-
192-
var query = Session.CreateQuery(nhLinqExpression);
193-
194-
SetParameters(query, nhLinqExpression.ParameterValuesByName);
195-
196-
return query.ExecuteUpdate();
197-
}
198-
199-
public int ExecuteInsert<T>(Expression expression)
200-
{
201-
var nhLinqExpression = new NhLinqInsertExpression<T>(Session.Factory, expression);
177+
var nhLinqExpression = new NhLinqDmlExpression<T>(queryMode, expression, Session.Factory);
202178

203179
var query = Session.CreateQuery(nhLinqExpression);
204180

src/NHibernate/Linq/InsertSyntax.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public int Into<TTarget>(Action<Assignments<TSource, TTarget>> assignmentActions
3131
var assignments = new Assignments<TSource, TTarget>();
3232
assignmentActions.Invoke(assignments);
3333

34-
return _provider.ExecuteInsert<TTarget>(DmlExpressionRewriter.PrepareExpression<TSource>(_sourceExpression, assignments.List));
34+
return ExecuteInsert<TTarget>(DmlExpressionRewriter.PrepareExpression<TSource>(_sourceExpression, assignments.List));
3535
}
3636

3737
/// <summary>
@@ -42,7 +42,12 @@ public int Into<TTarget>(Action<Assignments<TSource, TTarget>> assignmentActions
4242
/// <returns>The number of inserted entities.</returns>
4343
public int As<TTarget>(Expression<Func<TSource, TTarget>> expression)
4444
{
45-
return _provider.ExecuteInsert<TTarget>(DmlExpressionRewriter.PrepareExpression(_sourceExpression, expression));
45+
return ExecuteInsert<TTarget>(DmlExpressionRewriter.PrepareExpression(_sourceExpression, expression));
46+
}
47+
48+
private int ExecuteInsert<TTarget>(Expression insertExpression)
49+
{
50+
return _provider.ExecuteDml<TTarget>(QueryMode.Insert, insertExpression);
4651
}
4752
}
4853
}

src/NHibernate/Linq/LinqExtensionMethods.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public static IFutureValue<TResult> ToFutureValue<TSource, TResult>(this IQuerya
141141
public static int Delete<TSource>(this IQueryable<TSource> source)
142142
{
143143
var provider = GetNhProvider(source);
144-
return provider.ExecuteDelete<TSource>(source.Expression);
144+
return provider.ExecuteDml<TSource>(QueryMode.Delete, source.Expression);
145145
}
146146

147147
/// <summary>

src/NHibernate/Linq/NhLinqDeleteExpression.cs

Lines changed: 0 additions & 16 deletions
This file was deleted.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System.Linq.Expressions;
2+
using NHibernate.Engine;
3+
4+
namespace NHibernate.Linq
5+
{
6+
public class NhLinqDmlExpression<T> : NhLinqExpression
7+
{
8+
protected override QueryMode QueryMode { get; }
9+
10+
/// <summary>
11+
/// Entity type to insert or update when the expression is a DML.
12+
/// </summary>
13+
protected override System.Type TargetType => typeof(T);
14+
15+
public NhLinqDmlExpression(QueryMode queryMode, Expression expression, ISessionFactoryImplementor sessionFactory)
16+
: base(expression, sessionFactory)
17+
{
18+
Key = $"{queryMode.ToString().ToUpperInvariant()} {Key}";
19+
QueryMode = queryMode;
20+
}
21+
}
22+
}

src/NHibernate/Linq/NhLinqInsertExpression.cs

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/NHibernate/Linq/NhLinqUpdateExpression.cs

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/NHibernate/Linq/UpdateSyntax.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ public int As(Expression<Func<T, T>> expression)
4646
return ExecuteUpdate(DmlExpressionRewriter.PrepareExpression(_sourceExpression, expression));
4747
}
4848

49-
private int ExecuteUpdate(Expression expression)
49+
private int ExecuteUpdate(Expression updateExpression)
5050
{
51-
return _provider.ExecuteUpdate<T>(expression, _versioned);
51+
return _provider.ExecuteDml<T>(_versioned ? QueryMode.UpdateVersioned : QueryMode.Update, updateExpression);
5252
}
5353
}
5454
}

src/NHibernate/NHibernate.csproj

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,7 @@
335335
<Compile Include="Linq\ReWriters\ArrayIndexExpressionFlattener.cs" />
336336
<Compile Include="Linq\Visitors\IQueryModelRewriterFactory.cs" />
337337
<Compile Include="Linq\QueryProviderFactory.cs" />
338-
<Compile Include="Linq\NhLinqDeleteExpression.cs" />
339-
<Compile Include="Linq\NhLinqInsertExpression.cs" />
340-
<Compile Include="Linq\NhLinqUpdateExpression.cs" />
338+
<Compile Include="Linq\NhLinqDmlExpression.cs" />
341339
<Compile Include="Linq\QueryMode.cs" />
342340
<Compile Include="Linq\Assignments.cs" />
343341
<Compile Include="Linq\UpdateSyntax.cs" />

0 commit comments

Comments
 (0)