Skip to content

Commit 48e460d

Browse files
Update source
1 parent cc26283 commit 48e460d

File tree

11 files changed

+79
-35
lines changed

11 files changed

+79
-35
lines changed

src/shared/Z.EF.Plus.Audit.Shared/Audit/PreSaveChanges.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,12 @@ public static void PreSaveChanges(Audit audit, DbContext context)
3535
var changes = objectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted);
3636
#elif EFCORE
3737
context.ChangeTracker.DetectChanges();
38-
var changes = context.ChangeTracker.Entries().Where(x => x.State == EntityState.Added ||
39-
x.State == EntityState.Modified ||
40-
x.State == EntityState.Deleted);
38+
var changes = context.ChangeTracker
39+
.Entries()
40+
.Where(x => x.State == EntityState.Added ||
41+
x.State == EntityState.Modified ||
42+
x.State == EntityState.Deleted)
43+
.ToList(); // Fix for 10987: Item might be added to ChangeTracker during looping (unable to reproduce)
4144
#endif
4245

4346
foreach (var objectStateEntry in changes)

src/shared/Z.EF.Plus.QueryCache.Shared/QueryCacheManager.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,11 @@ public static string GetCacheKey(IQueryable query, string[] tags, bool isAsync =
577577
sb.AppendLine(query.Expression.ToString());
578578
sb.AppendLine(command.CommandText);
579579

580+
#if EFCORE_10X
581+
foreach (var parameter in queryContext.Parameters)
582+
#else
580583
foreach (var parameter in queryContext.ParameterValues)
584+
#endif
581585
{
582586
sb.Append(parameter.Key);
583587
sb.Append(";");

src/shared/Z.EF.Plus.QueryFilter.Shared/QueryFilterSet.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,8 +222,13 @@ public void UpdateInternalQuery(DbContext context, object query)
222222
if(context.IsEFCore2x())
223223
{
224224
var set = GetDbSetCompiled.Value(context);
225+
// https://github.com/dotnet/efcore/commit/fd4b2a6053d66f3ccd19023e4c879a5b9d756e02#diff-4e132cf6c13c8039f07a306f6392b39ac77859382dbf1cad8e5563726b23bc53
225226

227+
#if EFCORE_10X
228+
var field = set.GetType().GetField("<EntityQueryable>k__BackingField", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
229+
#else
226230
var field = set.GetType().GetField("_entityQueryable", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
231+
#endif
227232
field.SetValue(set, query);
228233
}
229234
else
@@ -240,5 +245,5 @@ public void UpdateInternalQuery(DbContext context, object query)
240245
}
241246
}
242247
#endif
243-
}
248+
}
244249
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
using Remotion.Linq.Clauses;
4343
using Microsoft.EntityFrameworkCore.Query.Sql;
4444
using Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal;
45+
using Z.EntityFramework.Extensions;
4546

4647
#elif EFCORE_3X
4748
using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
@@ -200,8 +201,7 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
200201
#endif
201202

202203
// REFLECTION: Query.Provider._queryCompiler._queryContextFactory
203-
var queryContextFactoryField = queryCompiler.GetType().GetField("_queryContextFactory", BindingFlags.NonPublic | BindingFlags.Instance);
204-
var queryContextFactory = (IQueryContextFactory) queryContextFactoryField.GetValue(queryCompiler);
204+
var queryContextFactory = (IQueryContextFactory)PublicMethods.GetQueryContextFactory(queryCompiler);
205205

206206
// REFLECTION: Query.Provider._queryCompiler._queryContextFactory.CreateQueryBuffer
207207
var createQueryBufferDelegateMethod = (typeof (QueryContextFactory)).GetMethod("CreateQueryBuffer", BindingFlags.NonPublic | BindingFlags.Instance);

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

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,11 @@ protected DbCommand CreateCommandCombined(bool isAsync = false)
487487
foreach (var relationalParameter in parameters)
488488
{
489489
value = null;
490+
#if EFCORE_10X
491+
var parameter = queryContext.Parameters[invariantName ?? relationalParameter.InvariantName];
492+
#else
490493
var parameter = queryContext.ParameterValues[invariantName ?? relationalParameter.InvariantName];
494+
#endif
491495

492496
// logic FROM BatchUpdate.cs
493497
methodeConvertFromProvider = null;
@@ -561,6 +565,35 @@ protected DbCommand CreateCommandCombined(bool isAsync = false)
561565
command.Parameters.Add(dbParameter);
562566
}
563567

568+
// Comme on touche pas souvent au coin savoir que c'est un rajout et qu'il date de x.
569+
// Udt | ZZZ-10730 | 2025-07-05 | Fix related to LinqKit only
570+
var getSqlDbType = dbParameter.GetType().GetProperty("SqlDbType", BindingFlags.Public | BindingFlags.Instance);
571+
572+
// CHECK if this is an Udt
573+
if (getSqlDbType != null && getSqlDbType.GetValue(dbParameter).ToString().Equals("Udt", StringComparison.OrdinalIgnoreCase))
574+
{
575+
if (propertyRelationalTypeMapping != null)
576+
{
577+
var relationalTypeMapping = propertyRelationalTypeMapping.GetValue(relationalParameter);
578+
579+
// Voir le jira pas uniquement "StoreType" de disponnible ici comme propriété.
580+
// Mais perso semble le plus juste.
581+
var getStoreType = relationalTypeMapping.GetType().GetProperty("StoreType", BindingFlags.Public | BindingFlags.Instance);
582+
var setSqlDbType = dbParameter.GetType().GetProperty("UdtTypeName", BindingFlags.Public | BindingFlags.Instance);
583+
584+
if (setSqlDbType != null && getStoreType != null)
585+
{
586+
var storeType = getStoreType.GetValue(relationalTypeMapping);
587+
588+
if (storeType != null && storeType is string stringStoreType)
589+
{
590+
// ex: stringStoreType == "hierarchyid"
591+
setSqlDbType.SetValue(dbParameter, stringStoreType);
592+
}
593+
}
594+
}
595+
}
596+
564597
if (isPostgreSQL)
565598
{
566599
var relationalTypeMappingProperty = typeof(TypeMappedRelationalParameter).GetProperty("RelationalTypeMapping", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
@@ -603,7 +636,7 @@ protected DbCommand CreateCommandCombined(bool isAsync = false)
603636

604637

605638

606-
sb.AppendLine(string.Concat("-- EF+ Query Future: ", queryCount, " of ", Queries.Count));
639+
sb.AppendLine(string.Concat("-- EF+ Query Future: ", queryCount, " of ", Queries.Count));
607640

608641
if (isOracle || isOracleManaged || isOracleDevArt)
609642
{

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
using Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal;
3838
using Remotion.Linq.Parsing.ExpressionVisitors.TreeEvaluation;
3939
using Remotion.Linq.Parsing.Structure;
40+
using Z.EntityFramework.Extensions;
4041

4142
#elif EFCORE_3X
4243
//using IEvaluatableExpressionFilter = Microsoft.EntityFrameworkCore.Query.Internal.IEvaluatableExpressionFilter;
@@ -80,16 +81,14 @@ internal static IEnumerable<T> MapReader<T>(this DbContext context, DbDataReader
8081
var createQueryParser = (QueryParser) createQueryParserMethod.Invoke(null, new[] {nodeTypeProvider});
8182

8283
// REFLECTION: Query.Provider._queryCompiler._database
83-
var databaseField = queryCompiler.GetType().GetField("_database", BindingFlags.NonPublic | BindingFlags.Instance);
84-
var database = (IDatabase) databaseField.GetValue(queryCompiler);
84+
var database = (IDatabase)PublicMethods.GetDatabase(queryCompiler);
8585

8686
// REFLECTION: Query.Provider._queryCompiler._evaluatableExpressionFilter
8787
var evaluatableExpressionFilterField = queryCompiler.GetType().GetField("_evaluatableExpressionFilter", BindingFlags.NonPublic | BindingFlags.Static);
8888
var evaluatableExpressionFilter = (IEvaluatableExpressionFilter) evaluatableExpressionFilterField.GetValue(null);
8989

9090
// REFLECTION: Query.Provider._queryCompiler._queryContextFactory
91-
var queryContextFactoryField = queryCompiler.GetType().GetField("_queryContextFactory", BindingFlags.NonPublic | BindingFlags.Instance);
92-
var queryContextFactory = (IQueryContextFactory) queryContextFactoryField.GetValue(queryCompiler);
91+
var queryContextFactory = (IQueryContextFactory)PublicMethods.GetQueryContextFactory(queryCompiler);
9392

9493
// REFLECTION: Query.Provider._queryCompiler._queryContextFactory.CreateQueryBuffer
9594
var createQueryBufferDelegateMethod = (typeof (QueryContextFactory)).GetMethod("CreateQueryBuffer", BindingFlags.NonPublic | BindingFlags.Instance);

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
using Microsoft.EntityFrameworkCore.Query.Sql;
3838
using Remotion.Linq.Parsing.ExpressionVisitors.TreeEvaluation;
3939
using Remotion.Linq.Parsing.Structure;
40+
using Z.EntityFramework.Extensions;
4041

4142
#endif
4243

@@ -172,13 +173,11 @@ public static IRelationalCommand CreateCommand(this IQueryable source, out Relat
172173
nodeTypeProvider = nodeTypeProviderProperty.GetValue(compiler);
173174
}
174175

175-
var queryContextFactoryField = compiler.GetType().GetField("_queryContextFactory", BindingFlags.NonPublic | BindingFlags.Instance);
176-
var queryContextFactory = (IQueryContextFactory)queryContextFactoryField.GetValue(compiler);
176+
var queryContextFactory = (IQueryContextFactory)PublicMethods.GetQueryContextFactory(compiler);
177177

178178
queryContext = (RelationalQueryContext)queryContextFactory.Create();
179179

180-
var databaseField = compiler.GetType().GetField("_database", BindingFlags.NonPublic | BindingFlags.Instance);
181-
var database = (IDatabase)databaseField.GetValue(compiler);
180+
var database = (IDatabase)PublicMethods.GetDatabase(compiler);
182181

183182
// REFLECTION: Query.Provider._queryCompiler
184183
var queryCompilerField = typeof(EntityQueryProvider).GetField("_queryCompiler", BindingFlags.NonPublic | BindingFlags.Instance);

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77

88
#if FULL || AUDIT || BATCH_DELETE || BATCH_UPDATE || QUERY_FUTURE
99
#if EFCORE
10-
using System;
11-
using System.Linq;
12-
using System.Reflection;
1310
using Microsoft.EntityFrameworkCore;
1411
using Microsoft.EntityFrameworkCore.ChangeTracking.Internal;
1512
using Microsoft.EntityFrameworkCore.Query;
1613
using Microsoft.EntityFrameworkCore.Query.Internal;
14+
using System;
15+
using System.Linq;
16+
using System.Reflection;
17+
using Z.EntityFramework.Extensions;
1718

1819
namespace Z.EntityFramework.Plus
1920
{
@@ -27,8 +28,7 @@ public static DbContext GetDbContext<T>(this IQueryable<T> source)
2728
var compilerField = typeof (EntityQueryProvider).GetField("_queryCompiler", BindingFlags.NonPublic | BindingFlags.Instance);
2829
var compiler = (QueryCompiler) compilerField.GetValue(source.Provider);
2930

30-
var queryContextFactoryField = compiler.GetType().GetField("_queryContextFactory", BindingFlags.NonPublic | BindingFlags.Instance);
31-
var queryContextFactory = (RelationalQueryContextFactory)queryContextFactoryField.GetValue(compiler);
31+
var queryContextFactory = (RelationalQueryContextFactory)PublicMethods.GetQueryContextFactory(compiler);
3232

3333
#if EFCORE_3X
3434
object stateManagerDynamic;
@@ -53,7 +53,7 @@ public static DbContext GetDbContext<T>(this IQueryable<T> source)
5353
}
5454
#else
5555
#if EFCORE
56-
object stateManagerDynamic;
56+
object stateManagerDynamic;
5757

5858
var dependenciesProperty = typeof(RelationalQueryContextFactory).GetProperty("Dependencies", BindingFlags.NonPublic | BindingFlags.Instance);
5959
if (dependenciesProperty != null)
@@ -98,8 +98,7 @@ public static DbContext GetDbContext(this IQueryable query)
9898
var compilerField = typeof (EntityQueryProvider).GetField("_queryCompiler", BindingFlags.NonPublic | BindingFlags.Instance);
9999
var compiler = (QueryCompiler) compilerField.GetValue(query.Provider);
100100

101-
var queryContextFactoryField = compiler.GetType().GetField("_queryContextFactory", BindingFlags.NonPublic | BindingFlags.Instance);
102-
var queryContextFactory = (RelationalQueryContextFactory) queryContextFactoryField.GetValue(compiler);
101+
var queryContextFactory = (RelationalQueryContextFactory)PublicMethods.GetQueryContextFactory(compiler);
103102

104103
#if EFCORE_3X
105104
object stateManagerDynamic;

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77

88
#if FULL || QUERY_FUTURE
99
#if EFCORE
10-
using System.Linq;
11-
using System.Reflection;
1210
using Microsoft.EntityFrameworkCore;
1311
using Microsoft.EntityFrameworkCore.ChangeTracking.Internal;
1412
using Microsoft.EntityFrameworkCore.Query;
15-
using Microsoft.EntityFrameworkCore.Query.Internal;
13+
using Microsoft.EntityFrameworkCore.Query.Internal;
14+
using System.Linq;
15+
using System.Reflection;
16+
using Z.EntityFramework.Extensions;
1617

1718
namespace Z.EntityFramework.Plus
1819
{
@@ -25,10 +26,10 @@ public static DbContext GetInMemoryContext<T>(this IQueryable<T> source)
2526
var compilerField = typeof(EntityQueryProvider).GetField("_queryCompiler", BindingFlags.NonPublic | BindingFlags.Instance);
2627
var compiler = (QueryCompiler)compilerField.GetValue(source.Provider);
2728

28-
var queryContextFactoryField = compiler.GetType().GetField("_queryContextFactory", BindingFlags.NonPublic | BindingFlags.Instance);
29-
var queryContextFactory = queryContextFactoryField.GetValue(compiler);
29+
var queryContextFactory = PublicMethods.GetQueryContextFactory(compiler);
30+
3031

31-
object stateManagerDynamic;
32+
object stateManagerDynamic;
3233

3334
#if EFCORE_3X
3435

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
using Microsoft.EntityFrameworkCore.Query;
2020
using Microsoft.EntityFrameworkCore.Query.Internal;
2121
using Microsoft.EntityFrameworkCore.Storage;
22+
using Z.EntityFramework.Extensions;
23+
2224

2325
#if EFCORE_2X
2426
using Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal;
@@ -64,16 +66,14 @@ public static IRelationalCommand GetDbCommand<T>(this IQueryable<T> query)
6466
var createQueryParser = (QueryParser)createQueryParserMethod.Invoke(null, new[] { nodeTypeProvider });
6567

6668
// REFLECTION: Query.Provider._queryCompiler._database
67-
var databaseField = queryCompiler.GetType().GetField("_database", BindingFlags.NonPublic | BindingFlags.Instance);
68-
var database = (IDatabase)databaseField.GetValue(queryCompiler);
69+
var database = (IDatabase)PublicMethods.GetDatabase(queryCompiler);
6970

7071
// REFLECTION: Query.Provider._queryCompiler._evaluatableExpressionFilter
7172
var evaluatableExpressionFilterField = queryCompiler.GetType().GetField("_evaluatableExpressionFilter", BindingFlags.NonPublic | BindingFlags.Static);
7273
var evaluatableExpressionFilter = (IEvaluatableExpressionFilter)evaluatableExpressionFilterField.GetValue(null);
7374

7475
// REFLECTION: Query.Provider._queryCompiler._queryContextFactory
75-
var queryContextFactoryField = queryCompiler.GetType().GetField("_queryContextFactory", BindingFlags.NonPublic | BindingFlags.Instance);
76-
var queryContextFactory = (IQueryContextFactory)queryContextFactoryField.GetValue(queryCompiler);
76+
var queryContextFactory = (IQueryContextFactory)PublicMethods.GetQueryContextFactory(queryCompiler);
7777

7878
// REFLECTION: Query.Provider._queryCompiler._queryContextFactory.CreateQueryBuffer
7979
var createQueryBufferDelegateMethod = (typeof(QueryContextFactory)).GetMethod("CreateQueryBuffer", BindingFlags.NonPublic | BindingFlags.Instance);

0 commit comments

Comments
 (0)