Skip to content

Commit e92367d

Browse files
author
zzzprojects
committed
Fix BatchDelete, BatchUpdate && Support EF Core 2.0
Fix BatchDelete, BatchUpdate && Support EF Core 2.0
1 parent 47f7ec5 commit e92367d

File tree

9 files changed

+200
-161
lines changed

9 files changed

+200
-161
lines changed

src/shared/Z.EF.Plus.BatchDelete.Shared/BatchDelete.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,12 @@ public int Execute<T>(IQueryable<T> query) where T : class
184184
// CREATE command
185185
var command = CreateCommand(innerObjectQuery, entity);
186186

187+
// WHERE 1 = 0
188+
if (command == null)
189+
{
190+
return 0;
191+
}
192+
187193
// EXECUTE
188194
var ownConnection = false;
189195

@@ -383,6 +389,12 @@ internal DbCommand CreateCommand<T>(ObjectQuery query, SchemaEntityType<T> entit
383389

384390
// GET inner query
385391
var customQuery = query.GetCommandTextAndParameters();
392+
393+
if (customQuery.Item1.EndsWith("WHERE 1 = 0", StringComparison.InvariantCultureIgnoreCase))
394+
{
395+
return null;
396+
}
397+
386398
var querySelect = customQuery.Item1;
387399

388400
// GET primary key join

src/shared/Z.EF.Plus.BatchUpdate.Shared/BatchUpdate.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,12 @@ public int Execute<T>(IQueryable<T> query, Expression<Func<T, T>> updateFactory)
187187
// CREATE command
188188
var command = CreateCommand(innerObjectQuery, entity, values);
189189

190+
// WHERE 1 = 0
191+
if (command == null)
192+
{
193+
return 0;
194+
}
195+
190196
// EXECUTE
191197
var ownConnection = false;
192198

@@ -373,6 +379,12 @@ internal DbCommand CreateCommand<T>(ObjectQuery query, SchemaEntityType<T> entit
373379

374380
// GET inner query
375381
var customQuery = query.GetCommandTextAndParameters();
382+
383+
if (customQuery.Item1.EndsWith("WHERE 1 = 0", StringComparison.InvariantCultureIgnoreCase))
384+
{
385+
return null;
386+
}
387+
376388
var querySelect = customQuery.Item1;
377389

378390
// GET primary key join

src/shared/Z.EF.Plus.QueryFuture.Shared/BaseQueryFuture.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public abstract class BaseQueryFuture
6868

6969
/// <summary>Gets or sets the query connection.</summary>
7070
/// <value>The query connection.</value>
71-
internal CreateEntityRelationConnection QueryConnection { get; set; }
71+
internal IRelationalConnection QueryConnection { get; set; }
7272

7373
public virtual void ExecuteInMemory()
7474
{
@@ -157,11 +157,17 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
157157

158158
// REFLECTION: Query.Provider._queryCompiler._database._queryCompilationContextFactory.Logger
159159
var loggerField = queryCompilationContextFactory.GetType().GetProperty("Logger", BindingFlags.NonPublic | BindingFlags.Instance);
160-
logger = (ISensitiveDataLogger)loggerField.GetValue(queryCompilationContextFactory);
160+
logger = loggerField.GetValue(queryCompilationContextFactory);
161161
}
162162

163163
// CREATE connection
164-
QueryConnection = new CreateEntityRelationConnection(connection);
164+
{
165+
QueryConnection = context.Database.GetService<IRelationalConnection>();
166+
var innerConnection = new CreateEntityConnection(QueryConnection.DbConnection, null);
167+
var innerConnectionField = typeof(RelationalConnection).GetField("_connection", BindingFlags.NonPublic | BindingFlags.Instance);
168+
innerConnectionField.SetValue(QueryConnection, new Microsoft.EntityFrameworkCore.Internal.LazyRef<DbConnection>(() => innerConnection));
169+
}
170+
165171

166172
// CREATE query context
167173
{
@@ -213,7 +219,9 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
213219
}
214220
else
215221
{
216-
newQuery = ParameterExtractingExpressionVisitor.ExtractParameters(Query.Expression, queryContext, evaluatableExpressionFilter, (ISensitiveDataLogger)logger);
222+
// CREATE new query from query visitor
223+
var extractParametersMethods = typeof(ParameterExtractingExpressionVisitor).GetMethod("ExtractParameters", BindingFlags.Public | BindingFlags.Static);
224+
newQuery = (Expression) extractParametersMethods.Invoke(null, new object[] {Query.Expression, queryContext, evaluatableExpressionFilter, logger});
217225
}
218226

219227
// PARSE new query
@@ -281,7 +289,7 @@ public IEnumerator<T> GetQueryEnumerator<T>(DbDataReader reader)
281289
var enumerator = (IEnumerator<T>)getEnumerator;
282290
return enumerator;
283291
#elif EFCORE
284-
QueryConnection.OriginalDataReader = reader;
292+
((CreateEntityConnection)QueryConnection.DbConnection).OriginalDataReader = reader;
285293
var queryExecutor = (Func<QueryContext, IEnumerable<T>>) QueryExecutor;
286294
var queryEnumerable = queryExecutor(QueryContext);
287295
return queryEnumerable.GetEnumerator();

src/shared/Z.EF.Plus._Core.Shared/EF/DbContext/DbContext.MapReader.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ internal static partial class InternalExtensions
4343
internal static IEnumerable<T> MapReader<T>(this DbContext context, DbDataReader reader) where T : class
4444
{
4545
#if EF5 || EF6
46-
return ((IObjectContextAdapter) context).ObjectContext.Translate<T>(reader);
46+
return ((IObjectContextAdapter)context).ObjectContext.Translate<T>(reader);
4747

4848
#elif EFCORE
4949
bool isEFCore2x = false;
@@ -131,7 +131,11 @@ internal static IEnumerable<T> MapReader<T>(this DbContext context, DbDataReader
131131
}
132132

133133
// CREATE connection
134-
var queryConnection = new CreateEntityRelationConnection(connection);
134+
var queryConnection = context.Database.GetService<IRelationalConnection>();
135+
var innerConnection = new CreateEntityConnection(queryConnection.DbConnection, null);
136+
//QueryConnection.DbConnection = innerConnection;
137+
var innerConnectionField = typeof(RelationalConnection).GetField("_connection", BindingFlags.NonPublic | BindingFlags.Instance);
138+
innerConnectionField.SetValue(queryConnection, new Microsoft.EntityFrameworkCore.Internal.LazyRef<DbConnection>(() => innerConnection));
135139

136140
// CREATE query context
137141
RelationalQueryContext queryContext;
@@ -170,7 +174,8 @@ internal static IEnumerable<T> MapReader<T>(this DbContext context, DbDataReader
170174
else
171175
{
172176
// CREATE new query from query visitor
173-
newQuery = ParameterExtractingExpressionVisitor.ExtractParameters(query.Expression, queryContext, evaluatableExpressionFilter, (ISensitiveDataLogger)logger);
177+
var extractParametersMethods = typeof(ParameterExtractingExpressionVisitor).GetMethod("ExtractParameters", BindingFlags.Public | BindingFlags.Static);
178+
newQuery = (Expression) extractParametersMethods.Invoke(null, new object[] {query.Expression, queryContext, evaluatableExpressionFilter, logger});
174179
}
175180

176181
// PARSE new query
@@ -185,7 +190,7 @@ internal static IEnumerable<T> MapReader<T>(this DbContext context, DbDataReader
185190
var queryExecutor = (Func<QueryContext, IEnumerable<T>>) createQueryExecutorMethodGeneric.Invoke(queryModelVisitor, new[] {queryModel});
186191

187192
// CREATE a fake reader since EntityFramework close it
188-
queryConnection.OriginalDataReader = new CreateEntityDataReader(reader);
193+
((CreateEntityConnection)queryConnection.DbConnection).OriginalDataReader = new CreateEntityDataReader(reader); ;
189194
var queryEnumerable = queryExecutor(queryContext);
190195
var enumerator = queryEnumerable.GetEnumerator();
191196

src/shared/Z.EF.Plus._Core.Shared/EFCore/CreateEntity/CreateEntityConnection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public CreateEntityConnection(DbConnection originalConnection, DbDataReader orig
2222

2323
private DbConnection OriginalConnection { get; }
2424

25-
private DbDataReader OriginalDataReader { get; }
25+
internal DbDataReader OriginalDataReader { get; set; }
2626

2727
public override string ConnectionString
2828
{

0 commit comments

Comments
 (0)