Skip to content

Commit d2b7858

Browse files
committed
Added support for EF5 queries. Closes #8
1 parent f0b16e3 commit d2b7858

3 files changed

Lines changed: 47 additions & 1 deletion

File tree

src/QueryPlanVisualizer/Helpers/DatabaseHelper.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Data.Common;
3+
using System.Data.Entity.Infrastructure;
34
using System.Data.Linq;
45
using System.Linq;
56
using System.Reflection;
@@ -39,6 +40,20 @@ public static DatabaseHelper Create<T>(DataContextBase dataContextBase, IQueryab
3940
}
4041
}
4142

43+
var query = queryable as DbQuery<T>;
44+
if (query != null)
45+
{
46+
var bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty;
47+
48+
var internalQuery = query.GetType().GetProperty("InternalQuery", bindingFlags)?.GetValue(query);
49+
var objectQuery = internalQuery?.GetType().GetProperty("ObjectQuery")?.GetValue(internalQuery) as System.Data.Objects.ObjectQuery<T>;
50+
51+
if (objectQuery != null) //EF5 uses ObjectQuery from System.Data.Objects namespace, EF6 uses System.Data.Entity.Core.Objects so it will be null
52+
{
53+
return new EntityFramework5DatabaseHelper(objectQuery);
54+
}
55+
}
56+
4257
return new EntityFrameworkDatabaseHelper();
4358
}
4459

src/QueryPlanVisualizer/Helpers/EntityFrameworkDatabaseHelper.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,41 @@
11
using System;
22
using System.Data.Common;
33
using System.Data.Entity.Infrastructure.Interception;
4+
using System.Data.EntityClient;
5+
using System.Data.Objects;
46
using System.Linq;
57

68
namespace ExecutionPlanVisualizer.Helpers
79
{
10+
class EntityFramework5DatabaseHelper : DatabaseHelper
11+
{
12+
private ObjectParameterCollection parameters;
13+
14+
public EntityFramework5DatabaseHelper(ObjectQuery objectQuery)
15+
{
16+
Connection = (objectQuery.Context.Connection as EntityConnection)?.StoreConnection;
17+
parameters = objectQuery.Parameters;
18+
}
19+
20+
protected override DbCommand CreateCommand(IQueryable queryable)
21+
{
22+
var command = Connection.CreateCommand();
23+
command.CommandText = queryable.ToString();
24+
25+
var copiedParameters = parameters.Select(parameter =>
26+
{
27+
var parameterCopy = command.CreateParameter();
28+
parameterCopy.ParameterName = parameter.Name;
29+
parameterCopy.Value = parameter.Value;
30+
return parameterCopy;
31+
}).ToArray();
32+
33+
command.Parameters.AddRange(copiedParameters);
34+
35+
return command;
36+
}
37+
}
38+
839
internal class EntityFrameworkDatabaseHelper : DatabaseHelper
940
{
1041
protected override DbCommand CreateCommand(IQueryable queryable)
@@ -47,7 +78,6 @@ protected override DbCommand CreateCommand(IQueryable queryable)
4778

4879
command.Parameters.AddRange(copiedParameters);
4980

50-
5181
return command;
5282
}
5383

src/QueryPlanVisualizer/QueryPlanVisualizer.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
<Reference Include="System" />
4747
<Reference Include="System.ComponentModel.DataAnnotations" />
4848
<Reference Include="System.Core" />
49+
<Reference Include="System.Data.Entity" />
4950
<Reference Include="System.Data.Linq" />
5051
<Reference Include="System.Drawing" />
5152
<Reference Include="System.Windows.Forms" />

0 commit comments

Comments
 (0)