From d2b785872fc3c54354d5de66ccda14249bd3370b Mon Sep 17 00:00:00 2001 From: Giorgi Dalakishvili Date: Mon, 28 Mar 2016 13:20:54 +0400 Subject: [PATCH] Added support for EF5 queries. Closes #8 --- .../Helpers/DatabaseHelper.cs | 15 +++++++++ .../Helpers/EntityFrameworkDatabaseHelper.cs | 32 ++++++++++++++++++- .../QueryPlanVisualizer.csproj | 1 + 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/QueryPlanVisualizer/Helpers/DatabaseHelper.cs b/src/QueryPlanVisualizer/Helpers/DatabaseHelper.cs index e2507d1..2ec2a93 100644 --- a/src/QueryPlanVisualizer/Helpers/DatabaseHelper.cs +++ b/src/QueryPlanVisualizer/Helpers/DatabaseHelper.cs @@ -1,5 +1,6 @@ using System; using System.Data.Common; +using System.Data.Entity.Infrastructure; using System.Data.Linq; using System.Linq; using System.Reflection; @@ -39,6 +40,20 @@ public static DatabaseHelper Create(DataContextBase dataContextBase, IQueryab } } + var query = queryable as DbQuery; + if (query != null) + { + var bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty; + + var internalQuery = query.GetType().GetProperty("InternalQuery", bindingFlags)?.GetValue(query); + var objectQuery = internalQuery?.GetType().GetProperty("ObjectQuery")?.GetValue(internalQuery) as System.Data.Objects.ObjectQuery; + + if (objectQuery != null) //EF5 uses ObjectQuery from System.Data.Objects namespace, EF6 uses System.Data.Entity.Core.Objects so it will be null + { + return new EntityFramework5DatabaseHelper(objectQuery); + } + } + return new EntityFrameworkDatabaseHelper(); } diff --git a/src/QueryPlanVisualizer/Helpers/EntityFrameworkDatabaseHelper.cs b/src/QueryPlanVisualizer/Helpers/EntityFrameworkDatabaseHelper.cs index 4d687b9..20a4f94 100644 --- a/src/QueryPlanVisualizer/Helpers/EntityFrameworkDatabaseHelper.cs +++ b/src/QueryPlanVisualizer/Helpers/EntityFrameworkDatabaseHelper.cs @@ -1,10 +1,41 @@ using System; using System.Data.Common; using System.Data.Entity.Infrastructure.Interception; +using System.Data.EntityClient; +using System.Data.Objects; using System.Linq; namespace ExecutionPlanVisualizer.Helpers { + class EntityFramework5DatabaseHelper : DatabaseHelper + { + private ObjectParameterCollection parameters; + + public EntityFramework5DatabaseHelper(ObjectQuery objectQuery) + { + Connection = (objectQuery.Context.Connection as EntityConnection)?.StoreConnection; + parameters = objectQuery.Parameters; + } + + protected override DbCommand CreateCommand(IQueryable queryable) + { + var command = Connection.CreateCommand(); + command.CommandText = queryable.ToString(); + + var copiedParameters = parameters.Select(parameter => + { + var parameterCopy = command.CreateParameter(); + parameterCopy.ParameterName = parameter.Name; + parameterCopy.Value = parameter.Value; + return parameterCopy; + }).ToArray(); + + command.Parameters.AddRange(copiedParameters); + + return command; + } + } + internal class EntityFrameworkDatabaseHelper : DatabaseHelper { protected override DbCommand CreateCommand(IQueryable queryable) @@ -47,7 +78,6 @@ protected override DbCommand CreateCommand(IQueryable queryable) command.Parameters.AddRange(copiedParameters); - return command; } diff --git a/src/QueryPlanVisualizer/QueryPlanVisualizer.csproj b/src/QueryPlanVisualizer/QueryPlanVisualizer.csproj index 2f5a7a2..de23d4e 100644 --- a/src/QueryPlanVisualizer/QueryPlanVisualizer.csproj +++ b/src/QueryPlanVisualizer/QueryPlanVisualizer.csproj @@ -46,6 +46,7 @@ +