Skip to content

Commit ee33384

Browse files
committed
Add functionality to add functionality to optimize your queries using Linq.Expression.Optimizer
Issue #50 solved.
1 parent 7fba3c2 commit ee33384

File tree

10 files changed

+168
-95
lines changed

10 files changed

+168
-95
lines changed

src-console/System.Linq.Dynamic.Core.ConsoleTestApp.net452/Program.cs

+32-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ static void Main(string[] args)
99
using (var context = new KendoGridDbContext())
1010
{
1111
string search = "2";
12-
var expected = context.Employees.Where(e => System.Data.Entity.SqlServer.SqlFunctions.StringConvert((double) e.EmployeeNumber).Contains(search)).ToArray();
12+
var expected = context.Employees.Where(e => System.Data.Entity.SqlServer.SqlFunctions.StringConvert((double)e.EmployeeNumber).Contains(search)).ToArray();
1313
foreach (var emp in expected)
1414
{
1515
Console.WriteLine($"System.Linq : {emp.Id} - {emp.EmployeeNumber}");
@@ -20,6 +20,37 @@ static void Main(string[] args)
2020
{
2121
Console.WriteLine($"DynamicLinq : {emp.Id} - {emp.EmployeeNumber}");
2222
}
23+
24+
Console.WriteLine(new String('-', 80));
25+
int x = 1002;
26+
int seven = 7;
27+
var testNonOptimize = context.Employees.Where(e => e.EmployeeNumber > 1000 && e.EmployeeNumber < x && 7 == seven);
28+
Console.WriteLine($"testNonOptimize {testNonOptimize}");
29+
foreach (var emp in testNonOptimize)
30+
{
31+
Console.WriteLine($"testNonOptimize: {emp.Id} - {emp.EmployeeNumber}");
32+
}
33+
34+
var testNonOptimizeDynamic = context.Employees.Where("EmployeeNumber > 1000 && EmployeeNumber < @0 and 7 == @1 and \"2\" == @2", x, seven, search);
35+
Console.WriteLine($"testNonOptimizeDynamic {testNonOptimizeDynamic}");
36+
foreach (var emp in testNonOptimizeDynamic)
37+
{
38+
Console.WriteLine($"testNonOptimizeDynamic: {emp.Id} - {emp.EmployeeNumber}");
39+
}
40+
41+
Console.WriteLine("Enable ExpressionOptimizer.visit");
42+
ExtensibilityPoint.QueryOptimizer = ExpressionOptimizer.visit;
43+
44+
//var testOptimize1 = context.Employees.Where(e => e.EmployeeNumber > 1000 && e.EmployeeNumber < x && 7 == seven);
45+
//var expression1 = ExpressionOptimizer.visit(testOptimize1.Expression);
46+
//Console.WriteLine(expression1);
47+
48+
var testOptimizeDynamic = context.Employees.Where("EmployeeNumber > 1000 && EmployeeNumber < @0 and 7 == @1 and \"2\" == @2", x, seven, search);
49+
Console.WriteLine($"testOptimizeDynamic : {testOptimizeDynamic}");
50+
foreach (var emp in testOptimizeDynamic)
51+
{
52+
Console.WriteLine($"testOptimizeDynamic: {emp.Id} - {emp.EmployeeNumber}");
53+
}
2354
}
2455
}
2556
}

src-console/System.Linq.Dynamic.Core.ConsoleTestApp.net452/System.Linq.Dynamic.Core.ConsoleTestApp.net452.csproj

+8
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,17 @@
5656
<HintPath>..\..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll</HintPath>
5757
<Private>True</Private>
5858
</Reference>
59+
<Reference Include="FSharp.Core, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
60+
<HintPath>..\..\packages\FSharp.Core.4.0.0.1\lib\net40\FSharp.Core.dll</HintPath>
61+
<Private>True</Private>
62+
</Reference>
5963
<Reference Include="JetBrains.Annotations">
6064
<HintPath>..\..\src\System.Linq.Dynamic.Core\bin\Debug\net452\JetBrains.Annotations.dll</HintPath>
6165
</Reference>
66+
<Reference Include="Linq.Expression.Optimizer, Version=1.0.6.0, Culture=neutral, PublicKeyToken=34b6af2337893e15, processorArchitecture=MSIL">
67+
<HintPath>..\..\packages\Linq.Expression.Optimizer.1.0.7\lib\net45\Linq.Expression.Optimizer.dll</HintPath>
68+
<Private>True</Private>
69+
</Reference>
6270
<Reference Include="System" />
6371
<Reference Include="System.ComponentModel.DataAnnotations" />
6472
<Reference Include="System.Core" />
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
33
<package id="EntityFramework" version="6.1.3" targetFramework="net452" />
4+
<package id="FSharp.Core" version="4.0.0.1" targetFramework="net452" />
5+
<package id="Linq.Expression.Optimizer" version="1.0.7" targetFramework="net452" />
46
</packages>

src/EntityFramework.DynamicLinq/project.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "1.0.3.0",
2+
"version": "1.0.3.1",
33
"title": "EntityFramework.DynamicLinq",
44
"description": "Dynamic Linq extensions for EntityFramework which adds Async support",
55
"authors": [ "Stef Heyenrath" ],
@@ -14,7 +14,7 @@
1414
},
1515
"projectUrl": "https://github.com/StefH/System.Linq.Dynamic.Core",
1616
"licenseUrl": "https://github.com/StefH/System.Linq.Dynamic.Core/blob/master/licence.txt",
17-
"releaseNotes": "Make library strong named and add an overload to the ToDynamicArray and ToDynamicList extension methods."
17+
"releaseNotes": "Add extensibility point for Expression optimization"
1818
},
1919

2020
"buildOptions": {
@@ -39,7 +39,7 @@
3939
"type": "build"
4040
},
4141
"EntityFramework": "6.1.3",
42-
"System.Linq.Dynamic.Core": "1.0.6.6"
42+
"System.Linq.Dynamic.Core": "1.0.6.7"
4343
},
4444

4545
"frameworks": {

src/Microsoft.EntityFrameworkCore.DynamicLinq/EFDynamicQueryableExtensions.cs

+9-9
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ namespace EntityFramework.DynamicLinq
2929
/// </summary>
3030
public static class EntityFrameworkDynamicQueryableExtensions
3131
{
32+
private static Expression OptimizeExpression(Expression expression)
33+
{
34+
return ExtensibilityPoint.QueryOptimizer != null ? ExtensibilityPoint.QueryOptimizer(expression) : expression;
35+
}
36+
3237
#region AnyAsync
3338
private static readonly MethodInfo _any = GetMethod(nameof(Queryable.Any));
3439

@@ -575,9 +580,8 @@ public static Task<dynamic> LastOrDefaultAsync([NotNull] this IQueryable source,
575580
operatorMethodInfo = operatorMethodInfo.MakeGenericMethod(source.ElementType);
576581
}
577582

578-
return provider.ExecuteAsync<TResult>(
579-
Expression.Call(null, operatorMethodInfo, source.Expression),
580-
cancellationToken);
583+
var optimized = OptimizeExpression(Expression.Call(null, operatorMethodInfo, source.Expression));
584+
return provider.ExecuteAsync<TResult>(optimized, cancellationToken);
581585
}
582586

583587
throw new InvalidOperationException(Res.IQueryableProviderNotAsync);
@@ -601,12 +605,8 @@ public static Task<dynamic> LastOrDefaultAsync([NotNull] this IQueryable source,
601605
? operatorMethodInfo.MakeGenericMethod(source.ElementType, typeof(TResult))
602606
: operatorMethodInfo.MakeGenericMethod(source.ElementType);
603607

604-
return provider.ExecuteAsync<TResult>(
605-
Expression.Call(
606-
null,
607-
operatorMethodInfo,
608-
new[] { source.Expression, expression }),
609-
cancellationToken);
608+
var optimized = OptimizeExpression(Expression.Call(null, operatorMethodInfo, new[] { source.Expression, expression }));
609+
return provider.ExecuteAsync<TResult>(optimized, cancellationToken);
610610
}
611611

612612
throw new InvalidOperationException(Res.IQueryableProviderNotAsync);

src/Microsoft.EntityFrameworkCore.DynamicLinq/project.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "1.0.3.0",
2+
"version": "1.0.3.1",
33
"title": "Microsoft.EntityFrameworkCore.DynamicLinq",
44
"description": "Dynamic Linq extensions for Microsoft.EntityFrameworkCore which adds Async support",
55
"authors": [ "Stef Heyenrath" ],
@@ -14,7 +14,7 @@
1414
},
1515
"projectUrl": "https://github.com/StefH/System.Linq.Dynamic.Core",
1616
"licenseUrl": "https://github.com/StefH/System.Linq.Dynamic.Core/blob/master/licence.txt",
17-
"releaseNotes": "Upgrade Microsoft.EntityFrameworkCore to version 1.0.1 and add an overload to the ToDynamicArray and ToDynamicList extension methods."
17+
"releaseNotes": "Add extensibility point for Expression optimization"
1818
},
1919

2020
"buildOptions": {
@@ -37,7 +37,7 @@
3737
"type": "build"
3838
},
3939
"Microsoft.EntityFrameworkCore": "1.0.1",
40-
"System.Linq.Dynamic.Core": "1.0.6.6"
40+
"System.Linq.Dynamic.Core": "1.0.6.7"
4141
},
4242

4343
"frameworks": {

src/System.Linq.Dynamic.Core.SL50/System.Linq.Dynamic.Core.SL50.csproj

+3
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@
124124
<Compile Include="..\System.Linq.Dynamic.Core\ExpressionParser.cs">
125125
<Link>ExpressionParser.cs</Link>
126126
</Compile>
127+
<Compile Include="..\System.Linq.Dynamic.Core\ExtensibilityPoint.cs">
128+
<Link>ExtensibilityPoint.cs</Link>
129+
</Compile>
127130
<Compile Include="..\System.Linq.Dynamic.Core\Extensions\LinqProviderExtensions.cs">
128131
<Link>Extensions\LinqProviderExtensions.cs</Link>
129132
</Compile>

0 commit comments

Comments
 (0)