Skip to content

Commit 48c9a7e

Browse files
author
zzzprojects
committed
Fix Issue with MySQL && Parameter
Fix Issue with MySQL && Parameter
1 parent f29d283 commit 48c9a7e

File tree

4 files changed

+90
-6
lines changed

4 files changed

+90
-6
lines changed

src/Z.EntityFramework.Plus.EF6.NET40/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@
1818
[assembly: AssemblyCulture("")]
1919
[assembly: ComVisible(false)]
2020
[assembly: Guid("ac398eb8-0a31-4d06-a804-84d10b6da96d")]
21-
[assembly: AssemblyVersion("1.2.4")]
22-
[assembly: AssemblyFileVersion("1.2.4")]
21+
[assembly: AssemblyVersion("1.2.5")]
22+
[assembly: AssemblyFileVersion("1.2.5")]

src/Z.EntityFramework.Plus.EF6.NET40/QueryFuture/QueryFutureBatch.cs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Collections.Generic;
1010
using System.Data;
1111
using System.Data.Common;
12+
using System.Reflection;
1213
using System.Text;
1314

1415
#if EF5
@@ -137,7 +138,7 @@ protected DbCommand CreateCommandCombined()
137138
foreach (var query in Queries)
138139
{
139140
// GENERATE SQL
140-
#if EF5 || EF6
141+
#if EF5
141142
var sql = query.Query.ToTraceString();
142143
var parameters = query.Query.Parameters;
143144

@@ -156,6 +157,47 @@ protected DbCommand CreateCommandCombined()
156157
// REPLACE parameter with new value
157158
sql = sql.Replace("@" + oldValue, "@" + newValue);
158159
}
160+
#elif EF6
161+
162+
var objectQuery = query.Query;
163+
var stateField = objectQuery.GetType().BaseType.GetField("_state", BindingFlags.NonPublic | BindingFlags.Instance);
164+
var state = stateField.GetValue(objectQuery);
165+
var getExecutionPlanMethod = state.GetType().GetMethod("GetExecutionPlan", BindingFlags.NonPublic | BindingFlags.Instance);
166+
var getExecutionPlan = getExecutionPlanMethod.Invoke(state, new object[] { null });
167+
var prepareEntityCommandMethod = getExecutionPlan.GetType().GetMethod("PrepareEntityCommand", BindingFlags.NonPublic | BindingFlags.Instance);
168+
169+
string sql = "";
170+
using (EntityCommand entityCommand = (EntityCommand) prepareEntityCommandMethod.Invoke(getExecutionPlan, new object[] {objectQuery.Context, objectQuery.Parameters}))
171+
{
172+
var getCommandDefinitionMethod = entityCommand.GetType().GetMethod("GetCommandDefinition", BindingFlags.NonPublic | BindingFlags.Instance);
173+
var getCommandDefinition = getCommandDefinitionMethod.Invoke(entityCommand, new object[0]);
174+
175+
var prepareEntityCommandBeforeExecutionMethod = getCommandDefinition.GetType().GetMethod("PrepareEntityCommandBeforeExecution", BindingFlags.NonPublic | BindingFlags.Instance);
176+
var prepareEntityCommandBeforeExecution = (DbCommand)prepareEntityCommandBeforeExecutionMethod.Invoke(getCommandDefinition, new object[] {entityCommand});
177+
178+
sql = prepareEntityCommandBeforeExecution.CommandText;
179+
var parameters = prepareEntityCommandBeforeExecution.Parameters;
180+
181+
// UPDATE parameter name
182+
foreach (DbParameter parameter in parameters)
183+
{
184+
var oldValue = parameter.ParameterName;
185+
if (oldValue.StartsWith("@"))
186+
{
187+
oldValue = oldValue.Substring(1);
188+
}
189+
var newValue = string.Concat("Z_", queryCount, "_", oldValue);
190+
191+
// CREATE parameter
192+
var dbParameter = command.CreateParameter();
193+
dbParameter.ParameterName = newValue;
194+
dbParameter.Value = parameter.Value;
195+
command.Parameters.Add(dbParameter);
196+
197+
// REPLACE parameter with new value
198+
sql = sql.Replace("@" + oldValue, "@" + newValue);
199+
}
200+
}
159201
#elif EFCORE
160202

161203
RelationalQueryContext queryContext;

src/Z.EntityFramework.Plus.EF6/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@
1818
[assembly: AssemblyCulture("")]
1919
[assembly: ComVisible(false)]
2020
[assembly: Guid("89f47e22-ff83-4ac8-be90-c6755748cf89")]
21-
[assembly: AssemblyVersion("1.2.4")]
22-
[assembly: AssemblyFileVersion("1.2.4")]
21+
[assembly: AssemblyVersion("1.2.5")]
22+
[assembly: AssemblyFileVersion("1.2.5")]

src/Z.EntityFramework.Plus.EF6/QueryFuture/QueryFutureBatch.cs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Collections.Generic;
1010
using System.Data;
1111
using System.Data.Common;
12+
using System.Reflection;
1213
using System.Text;
1314

1415
#if EF5
@@ -137,7 +138,7 @@ protected DbCommand CreateCommandCombined()
137138
foreach (var query in Queries)
138139
{
139140
// GENERATE SQL
140-
#if EF5 || EF6
141+
#if EF5
141142
var sql = query.Query.ToTraceString();
142143
var parameters = query.Query.Parameters;
143144

@@ -156,6 +157,47 @@ protected DbCommand CreateCommandCombined()
156157
// REPLACE parameter with new value
157158
sql = sql.Replace("@" + oldValue, "@" + newValue);
158159
}
160+
#elif EF6
161+
162+
var objectQuery = query.Query;
163+
var stateField = objectQuery.GetType().BaseType.GetField("_state", BindingFlags.NonPublic | BindingFlags.Instance);
164+
var state = stateField.GetValue(objectQuery);
165+
var getExecutionPlanMethod = state.GetType().GetMethod("GetExecutionPlan", BindingFlags.NonPublic | BindingFlags.Instance);
166+
var getExecutionPlan = getExecutionPlanMethod.Invoke(state, new object[] { null });
167+
var prepareEntityCommandMethod = getExecutionPlan.GetType().GetMethod("PrepareEntityCommand", BindingFlags.NonPublic | BindingFlags.Instance);
168+
169+
string sql = "";
170+
using (EntityCommand entityCommand = (EntityCommand) prepareEntityCommandMethod.Invoke(getExecutionPlan, new object[] {objectQuery.Context, objectQuery.Parameters}))
171+
{
172+
var getCommandDefinitionMethod = entityCommand.GetType().GetMethod("GetCommandDefinition", BindingFlags.NonPublic | BindingFlags.Instance);
173+
var getCommandDefinition = getCommandDefinitionMethod.Invoke(entityCommand, new object[0]);
174+
175+
var prepareEntityCommandBeforeExecutionMethod = getCommandDefinition.GetType().GetMethod("PrepareEntityCommandBeforeExecution", BindingFlags.NonPublic | BindingFlags.Instance);
176+
var prepareEntityCommandBeforeExecution = (DbCommand)prepareEntityCommandBeforeExecutionMethod.Invoke(getCommandDefinition, new object[] {entityCommand});
177+
178+
sql = prepareEntityCommandBeforeExecution.CommandText;
179+
var parameters = prepareEntityCommandBeforeExecution.Parameters;
180+
181+
// UPDATE parameter name
182+
foreach (DbParameter parameter in parameters)
183+
{
184+
var oldValue = parameter.ParameterName;
185+
if (oldValue.StartsWith("@"))
186+
{
187+
oldValue = oldValue.Substring(1);
188+
}
189+
var newValue = string.Concat("Z_", queryCount, "_", oldValue);
190+
191+
// CREATE parameter
192+
var dbParameter = command.CreateParameter();
193+
dbParameter.ParameterName = newValue;
194+
dbParameter.Value = parameter.Value;
195+
command.Parameters.Add(dbParameter);
196+
197+
// REPLACE parameter with new value
198+
sql = sql.Replace("@" + oldValue, "@" + newValue);
199+
}
200+
}
159201
#elif EFCORE
160202

161203
RelationalQueryContext queryContext;

0 commit comments

Comments
 (0)