Skip to content

Commit 0fc3957

Browse files
Update source for EF Core 3.x
Update source for EF Core 3.x
1 parent 3de57b6 commit 0fc3957

File tree

9 files changed

+171
-59
lines changed

9 files changed

+171
-59
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup Label="Globals">
4+
<SccProjectName>SAK</SccProjectName>
5+
<SccProvider>SAK</SccProvider>
6+
<SccAuxPath>SAK</SccAuxPath>
7+
<SccLocalPath>SAK</SccLocalPath>
8+
</PropertyGroup>
9+
10+
<PropertyGroup>
11+
<TargetFramework>netstandard2.0</TargetFramework>
12+
<AssemblyName>Z.EntityFramework.Plus.EFCore</AssemblyName>
13+
<RootNamespace>Z.EntityFramework.Plus.EFCore.NETStandard20</RootNamespace>
14+
<SignAssembly>true</SignAssembly>
15+
<AssemblyOriginatorKeyFile>zzzproject.pfx</AssemblyOriginatorKeyFile>
16+
<PackageId>Z.EntityFramework.Plus.EFCore</PackageId>
17+
<Version>3.0.0</Version>
18+
<Authors>Z.EntityFramework.Plus.EFCore</Authors>
19+
<Company>Z.EntityFramework.Plus.EFCore</Company>
20+
<Product>Z.EntityFramework.Plus.EFCore</Product>
21+
<Description>Description: EF Bulk Operations &amp; Utilities | Bulk Insert, Update, Delete, Merge from database.</Description>
22+
</PropertyGroup>
23+
24+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
25+
<DefineConstants>TRACE;RELEASE;NETSTANDARD2_0;EFCORE NET45 FULL EFCORE_3X</DefineConstants>
26+
<DocumentationFile>bin\Release\netstandard2.0\Z.EntityFramework.Plus.EFCore.xml</DocumentationFile>
27+
</PropertyGroup>
28+
29+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
30+
<DefineConstants>TRACE;NETSTANDARD2_0;EFCORE NET45 FULL;NETSTANDARD2_0;EFCORE_3X</DefineConstants>
31+
</PropertyGroup>
32+
33+
<Import Project="..\shared\Z.EF.Plus._Core.Shared\Z.EF.Plus._Core.Shared.projitems" Label="Shared" />
34+
35+
<Import Project="..\shared\Z.EF.Plus._ExceptionMessage.Shared\Z.EF.Plus._ExceptionMessage.Shared.projitems" Label="Shared" />
36+
37+
<Import Project="..\shared\Z.EF.Plus.Audit.Shared\Z.EF.Plus.Audit.Shared.projitems" Label="Shared" />
38+
39+
<Import Project="..\shared\Z.EF.Plus.BatchDelete.Shared\Z.EF.Plus.BatchDelete.Shared.projitems" Label="Shared" />
40+
41+
<Import Project="..\shared\Z.EF.Plus.BatchUpdate.Shared\Z.EF.Plus.BatchUpdate.Shared.projitems" Label="Shared" />
42+
43+
<Import Project="..\shared\Z.EF.Plus.QueryCache.Shared\Z.EF.Plus.QueryCache.Shared.projitems" Label="Shared" />
44+
45+
<Import Project="..\shared\Z.EF.Plus.QueryDeferred.Shared\Z.EF.Plus.QueryDeferred.Shared.projitems" Label="Shared" />
46+
47+
<Import Project="..\shared\Z.EF.Plus.QueryExtensions.Shared\Z.EF.Plus.QueryExtensions.Shared.projitems" Label="Shared" />
48+
49+
<Import Project="..\shared\Z.EF.Plus.QueryFilter.Shared\Z.EF.Plus.QueryFilter.Shared.projitems" Label="Shared" />
50+
51+
<Import Project="..\shared\Z.EF.Plus.QueryFuture.Shared\Z.EF.Plus.QueryFuture.Shared.projitems" Label="Shared" />
52+
53+
<Import Project="..\shared\Z.EF.Plus.QueryIncludeFilterCore.Shared\Z.EF.Plus.QueryIncludeFilterCore.Shared.projitems" Label="Shared" />
54+
55+
<ItemGroup>
56+
<PackageReference Include="Microsoft.CSharp" Version="4.6.0-preview5.19224.8" />
57+
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.0.0-preview5.19227.1" />
58+
<PackageReference Include="System.Reflection.Emit" Version="4.3.0" />
59+
<PackageReference Include="System.Reflection.TypeExtensions" Version="4.6.0-preview5.19224.8" />
60+
</ItemGroup>
61+
62+
</Project>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
""
2+
{
3+
"FILE_VERSION" = "9237"
4+
"ENLISTMENT_CHOICE" = "NEVER"
5+
"PROJECT_FILE_RELATIVE_PATH" = ""
6+
"NUMBER_OF_EXCLUDED_FILES" = "0"
7+
"ORIGINAL_PROJECT_FILE_PATH" = ""
8+
"NUMBER_OF_NESTED_PROJECTS" = "0"
9+
"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
10+
}

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

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@
3737
using Microsoft.EntityFrameworkCore.Query.Expressions;
3838
using Remotion.Linq.Clauses;
3939
using Microsoft.EntityFrameworkCore.Query.Sql;
40+
using Microsoft.EntityFrameworkCore.Diagnostics;
4041

42+
#endif
43+
#if EFCORE_3X
44+
using IEvaluatableExpressionFilter = Microsoft.EntityFrameworkCore.Query.Internal.IEvaluatableExpressionFilter;
4145
#endif
4246

4347
namespace Z.EntityFramework.Plus
@@ -89,6 +93,8 @@ public virtual void ExecuteInMemory()
8993
/// <returns>The new executor and get command.</returns>
9094
public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQueryContext queryContext)
9195
{
96+
queryContext = null;
97+
9298
bool isEFCore2x = false;
9399
bool EFCore_2_1 = false;
94100
#if EFCORE
@@ -234,15 +240,11 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
234240
var innerConnectionField = typeof(RelationalConnection).GetField("_connection", BindingFlags.NonPublic | BindingFlags.Instance);
235241
var initalConnection = innerConnectionField.GetValue(QueryConnection);
236242

237-
if (EFCoreHelper.IsVersion3xPreview5)
238-
{
239-
innerConnectionField.SetValue(QueryConnection, innerConnection);
240-
}
241-
else
242-
{
243-
innerConnectionField.SetValue(QueryConnection, LazyHelper.NewLazy<DbConnection>(() => innerConnection));
244-
}
245-
243+
#if EFCORE_3X
244+
innerConnectionField.SetValue(QueryConnection, innerConnection);
245+
#else
246+
innerConnectionField.SetValue(QueryConnection, LazyHelper.NewLazy<DbConnection>(() => innerConnection));
247+
#endif
246248

247249
RestoreConnection = () => innerConnectionField.SetValue(QueryConnection, initalConnection);
248250
}
@@ -254,28 +256,45 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
254256
var relationalQueryContextConstructor = relationalQueryContextType.GetConstructors()[0];
255257

256258
// EF Core 1.1 preview
257-
if (relationalQueryContextConstructor.GetParameters().Length == 5)
259+
if (isEFCore3x)
258260
{
259261
// REFLECTION: Query.Provider._queryCompiler._queryContextFactory.ExecutionStrategyFactory
260262
var executionStrategyFactoryField = queryContextFactory.GetType().GetProperty("ExecutionStrategyFactory", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
261263
var executionStrategyFactory = executionStrategyFactoryField.GetValue(queryContextFactory);
262264

263-
var lazyRefStateManager = LazyHelper.NewLazy(() => stateManager);
265+
var dependenciesProperty3 = typeof(RelationalQueryContextFactory).GetProperty("Dependencies", BindingFlags.NonPublic | BindingFlags.Instance);
266+
var dependencies3 = dependenciesProperty3.GetValue(queryContextFactory);
267+
268+
queryContext = (RelationalQueryContext)relationalQueryContextConstructor.Invoke(new object[] { dependencies3, createQueryBufferDelegate, QueryConnection, executionStrategyFactory });
269+
}
270+
else if (relationalQueryContextConstructor.GetParameters().Length == 5)
271+
{
272+
// REFLECTION: Query.Provider._queryCompiler._queryContextFactory.ExecutionStrategyFactory
273+
var executionStrategyFactoryField = queryContextFactory.GetType().GetProperty("ExecutionStrategyFactory", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
274+
var executionStrategyFactory = executionStrategyFactoryField.GetValue(queryContextFactory);
264275

276+
#if !EFCORE_3X
277+
var lazyRefStateManager = LazyHelper.NewLazy(() => stateManager);
265278
queryContext = (RelationalQueryContext)relationalQueryContextConstructor.Invoke(new object[] { createQueryBufferDelegate, QueryConnection, lazyRefStateManager, concurrencyDetector, executionStrategyFactory });
279+
#endif
280+
281+
282+
266283
}
267284
else if(isEFCore2x)
268285
{
269286
// REFLECTION: Query.Provider._queryCompiler._queryContextFactory.ExecutionStrategyFactory
270287
var executionStrategyFactoryField = queryContextFactory.GetType().GetProperty("ExecutionStrategyFactory", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
271288
var executionStrategyFactory = executionStrategyFactoryField.GetValue(queryContextFactory);
272289

290+
#if !EFCORE_3X
273291
var lazyRefStateManager = LazyHelper.NewLazy(() => stateManager);
274292

275293
var dependenciesProperty3 = typeof(RelationalQueryContextFactory).GetProperty("Dependencies", BindingFlags.NonPublic | BindingFlags.Instance);
276294
var dependencies3 = dependenciesProperty3.GetValue(queryContextFactory);
277295

278296
queryContext = (RelationalQueryContext)relationalQueryContextConstructor.Invoke(new object[] { dependencies3, createQueryBufferDelegate, QueryConnection, executionStrategyFactory });
297+
#endif
279298
}
280299
else
281300
{
@@ -284,16 +303,18 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
284303
}
285304

286305

287-
Expression newQuery;
306+
Expression newQuery = null;
288307

289308
if (isEFCore3x)
290309
{
291-
var parameterExtractingExpressionVisitorConstructor = typeof(ParameterExtractingExpressionVisitor).GetConstructors().First(x => x.GetParameters().Length == 6);
292-
293-
var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] { evaluatableExpressionFilter, queryContext, queryContext.GetType(), logger, true, false });
294-
295-
// CREATE new query from query visitor
296-
newQuery = parameterExtractingExpressionVisitor.ExtractParameters(Query.Expression);
310+
#if EFCORE_3X
311+
var visitor = new ParameterExtractingExpressionVisitor(evaluatableExpressionFilter, queryContext, queryContext.GetType(), (IDiagnosticsLogger<DbLoggerCategory.Query>)logger, true, false);
312+
newQuery = visitor.ExtractParameters(Query.Expression);
313+
#endif
314+
//var parameterExtractingExpressionVisitorConstructor = typeof(ParameterExtractingExpressionVisitor).GetConstructors().First(x => x.GetParameters().Length == 6);
315+
//var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] { evaluatableExpressionFilter, queryContext, queryContext.GetType(), logger, true, false });
316+
//// CREATE new query from query visitor
317+
//newQuery = parameterExtractingExpressionVisitor.ExtractParameters(Query.Expression);
297318
}
298319
else if(isEFCore2x)
299320
{
@@ -394,8 +415,8 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
394415
}
395416
#endif
396417

397-
/// <summary>Sets the result of the query deferred.</summary>
398-
/// <param name="reader">The reader returned from the query execution.</param>
418+
/// <summary>Sets the result of the query deferred.</summary>
419+
/// <param name="reader">The reader returned from the query execution.</param>
399420
public virtual void SetResult(DbDataReader reader)
400421
{
401422
}

src/shared/Z.EF.Plus.QueryIncludeFilterCore.Shared/QueryIncludeFilterProvider.cs

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,15 @@ public TResult Execute<TResult>(Expression expression)
145145
arguments.RemoveAt(1);
146146
}
147147

148+
#if EFCORE_3X
149+
// RESOLE parent queries using .FutureValue();
150+
var immediateQuery = new EntityQueryable<TResult>((IAsyncQueryProvider)OriginalProvider, expression);
151+
#else
148152
// RESOLE parent queries using .FutureValue();
149153
var immediateQuery = new EntityQueryable<TResult>((IAsyncQueryProvider)OriginalProvider);
150154
var expressionProperty = typeof(QueryableBase<>).MakeGenericType(typeof(TResult)).GetProperty("Expression", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
151155
expressionProperty.SetValue(immediateQuery, expression);
156+
#endif
152157

153158
object value = null;
154159

@@ -219,46 +224,23 @@ public TResult Execute<TResult>(Expression expression)
219224
return (TResult)value;
220225
}
221226

227+
#if EFCORE_3X
228+
public TResult ExecuteAsync<TResult>(Expression expression)
229+
{
230+
throw new Exception(ExceptionMessage.GeneralException);
231+
}
232+
#else
222233
public IAsyncEnumerable<TResult> ExecuteAsync<TResult>(Expression expression)
223234
{
224235
throw new Exception(ExceptionMessage.GeneralException);
225236
}
226237

238+
239+
#endif
227240
public Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken)
228241
{
229242
return Task.Run(() => Execute<TResult>(expression), cancellationToken);
230243
}
231-
232-
//public TResult ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken)
233-
//{
234-
// throw new Exception("a");
235-
//}
236-
237-
238-
///// <summary>Executes the given expression asynchronously.</summary>
239-
///// <exception cref="Exception">Thrown when an exception error condition occurs.</exception>
240-
///// <param name="expression">The expression to execute.</param>
241-
///// <param name="cancellationToken">The cancellation token.</param>
242-
///// <returns>The object returned by the execution of the expression.</returns>
243-
//public Task<object> ExecuteAsync(Expression expression, CancellationToken cancellationToken)
244-
//{
245-
// throw new Exception(ExceptionMessage.GeneralException);
246-
//}
247-
248-
//public IAsyncEnumerable<TResult> ExecuteAsync<TResult>(Expression expression)
249-
//{
250-
// throw new Exception("TODO: public IAsyncEnumerable<TResult> ExecuteAsync<TResult>(Expression expression)");
251-
// //return Task.Run(() => Execute<TResult>(expression));
252-
//}
253-
254-
///// <summary>Executes the given expression asynchronously.</summary>
255-
///// <typeparam name="TResult">Type of the result.</typeparam>
256-
///// <param name="expression">The expression to execute.</param>
257-
///// <param name="cancellationToken">The cancellation token.</param>
258-
///// <returns>The object returned by the execution of the expression.</returns>
259-
//public Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken)
260-
//{
261-
// return Task.Run(() => Execute<TResult>(expression), cancellationToken);
262-
//}
244+
263245
}
264246
}

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636

3737
#endif
3838

39+
#if EFCORE_3X
40+
using IEvaluatableExpressionFilter = Microsoft.EntityFrameworkCore.Query.Internal.IEvaluatableExpressionFilter;
41+
#endif
42+
3943
namespace Z.EntityFramework.Plus
4044
{
4145
internal static partial class InternalExtensions
@@ -135,24 +139,31 @@ internal static IEnumerable<T> MapReader<T>(this DbContext context, DbDataReader
135139
var innerConnection = new CreateEntityConnection(queryConnection.DbConnection, null);
136140
//QueryConnection.DbConnection = innerConnection;
137141
var innerConnectionField = typeof(RelationalConnection).GetField("_connection", BindingFlags.NonPublic | BindingFlags.Instance);
138-
innerConnectionField.SetValue(queryConnection, new Microsoft.EntityFrameworkCore.Internal.LazyRef<DbConnection>(() => innerConnection));
142+
143+
#if EFCORE_3X
144+
innerConnectionField.SetValue(queryConnection, innerConnection);
145+
#else
146+
innerConnectionField.SetValue(queryConnection, LazyHelper.NewLazy<DbConnection>(() => innerConnection));
147+
#endif
139148

140149
// CREATE query context
141-
RelationalQueryContext queryContext;
150+
RelationalQueryContext queryContext = null;
142151
{
143152
var relationalQueryContextType = typeof(RelationalQueryContext);
144153
var relationalQueryContextConstructor = relationalQueryContextType.GetConstructors()[0];
145154

146155
// EF Core 1.1 preview
147156
if (relationalQueryContextConstructor.GetParameters().Length == 5)
148157
{
158+
#if !EFCORE_3X
149159
// REFLECTION: Query.Provider._queryCompiler._queryContextFactory.ExecutionStrategyFactory
150160
var executionStrategyFactoryField = queryContextFactory.GetType().GetProperty("ExecutionStrategyFactory", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
151161
var executionStrategyFactory = executionStrategyFactoryField.GetValue(queryContextFactory);
152162

153163
var lazyRefStateManager = LazyHelper.NewLazy(() => stateManager);
154164

155165
queryContext = (RelationalQueryContext)relationalQueryContextConstructor.Invoke(new object[] { createQueryBufferDelegate, connection, lazyRefStateManager, concurrencyDetector, executionStrategyFactory });
166+
#endif
156167
}
157168
else
158169
{
@@ -200,7 +211,7 @@ internal static IEnumerable<T> MapReader<T>(this DbContext context, DbDataReader
200211
}
201212
return list;
202213
#endif
203-
}
214+
}
204215
}
205216
}
206217
#endif

src/shared/Z.EF.Plus._Core.Shared/EFCore/EFCoreHelper.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,13 @@ namespace Z.EntityFramework.Plus
1212
{
1313
internal static partial class EFCoreHelper
1414
{
15-
internal static bool IsVersion3x = typeof(IQuerySqlGenerator).GetMethod("GenerateSql").GetParameters().Length == 3;
16-
internal static bool IsVersion3xPreview5 = IsVersion3x && typeof(DbContext).Assembly.GetType("Microsoft.EntityFrameworkCore.Internal.LazyRef`1") == null;
15+
#if EFCORE_3X
16+
internal static bool IsVersion3x = true;
17+
internal static bool IsVersion3xPreview5 = true;
18+
#else
19+
internal static bool IsVersion3x = false;
20+
internal static bool IsVersion3xPreview5 = false;
21+
#endif
1722
}
1823
}
1924
#endif

src/shared/Z.EF.Plus._Core.Shared/EFCore/IQueryable`/CreateCommand.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
using Remotion.Linq.Parsing.ExpressionVisitors.TreeEvaluation;
2121
using Remotion.Linq.Parsing.Structure;
2222

23+
#if EFCORE_3X
24+
using IEvaluatableExpressionFilter = Microsoft.EntityFrameworkCore.Query.Internal.IEvaluatableExpressionFilter;
25+
#endif
26+
2327
namespace Z.EntityFramework.Plus
2428
{
2529
internal static partial class InternalExtensions
@@ -110,7 +114,12 @@ public static IRelationalCommand CreateCommand<T>(this IQueryable<T> source, out
110114
var queries = queryModelVisitor.Queries;
111115
var sqlQuery = queries.ToList()[0];
112116

117+
#if EFCORE_3X
118+
var commandBuilderFactory = queryContext.Context.Database.GetService<IRelationalCommandBuilderFactory>();
119+
var command = sqlQuery.CreateDefaultQuerySqlGenerator().GenerateSql(commandBuilderFactory, queryContext.ParameterValues, null);
120+
#else
113121
var command = sqlQuery.CreateDefaultQuerySqlGenerator().GenerateSql(queryContext.ParameterValues);
122+
#endif
114123

115124
return command;
116125
}

0 commit comments

Comments
 (0)