Skip to content

Commit 5a440e8

Browse files
author
zzzprojects
committed
Fix hidden type
Fix hidden type
1 parent 5fec5f4 commit 5a440e8

File tree

2 files changed

+66
-46
lines changed

2 files changed

+66
-46
lines changed

src/shared/Z.EF.Plus.QueryFilterInterceptor.Shared/QueryFilterInterceptorContext.cs

Lines changed: 65 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -298,68 +298,88 @@ private void Initialize(DbContext context)
298298
}
299299
}
300300
}
301-
301+
302+
303+
var entityTypes = context.GetObjectContext().MetadataWorkspace.GetItemCollection(DataSpace.OSpace)
304+
.Where(x => x.BuiltInTypeKind == BuiltInTypeKind.EntityType);
305+
306+
foreach (var entityType in entityTypes)
307+
{
308+
var typeField = entityType.GetType().GetField("_type", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
309+
310+
if (typeField != null)
311+
{
312+
var type = (Type)typeField.GetValue(entityType);
313+
TryRegisterType(context, type);
314+
}
315+
}
316+
302317
foreach (var type in QueryFilterManager.Types)
303318
{
304-
var setMethod = context.GetType().GetMethod("Set", new Type[0]);
305-
var dbSet = setMethod.MakeGenericMethod(type).Invoke(context, null);
319+
TryRegisterType(context, type);
320+
}
321+
}
306322

307-
Type elementType = type;
323+
private void TryRegisterType(DbContext context, Type type)
324+
{
325+
var setMethod = context.GetType().GetMethod("Set", new Type[0]);
326+
var dbSet = setMethod.MakeGenericMethod(type).Invoke(context, null);
308327

309-
// DbSet<>.InternalQuery
310-
var internalQueryProperty = typeof(DbQuery<>).MakeGenericType(elementType).GetProperty("InternalQuery", BindingFlags.NonPublic | BindingFlags.Instance);
311-
var internalQuery = internalQueryProperty.GetValue(dbSet, null);
328+
Type elementType = type;
312329

313-
var entityTypebase = type.FullName;
330+
// DbSet<>.InternalQuery
331+
var internalQueryProperty = typeof(DbQuery<>).MakeGenericType(elementType).GetProperty("InternalQuery", BindingFlags.NonPublic | BindingFlags.Instance);
332+
var internalQuery = internalQueryProperty.GetValue(dbSet, null);
314333

315-
try
316-
{
317-
// DbSet<>.InternalQuery.EntitySet
318-
var entitySetProperty = internalQuery.GetType().GetProperty("EntitySet", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
319-
var entitySet = (EntitySet)entitySetProperty.GetValue(internalQuery, null);
334+
var entityTypebase = type.FullName;
320335

321-
entityTypebase = entitySet.ElementType.FullName;
322-
}
323-
catch
324-
{
325-
// Silence catch, it's k... it doesn't always exist!
326-
327-
}
336+
try
337+
{
338+
// DbSet<>.InternalQuery.EntitySet
339+
var entitySetProperty = internalQuery.GetType().GetProperty("EntitySet", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
340+
var entitySet = (EntitySet)entitySetProperty.GetValue(internalQuery, null);
328341

329-
// TypeByEntitySetBase
342+
entityTypebase = entitySet.ElementType.FullName;
343+
}
344+
catch
345+
{
346+
// Silence catch, it's k... it doesn't always exist!
347+
348+
}
349+
350+
// TypeByEntitySetBase
351+
{
352+
if (!TypeByEntitySetBase.ContainsKey(entityTypebase))
330353
{
331-
if (!TypeByEntitySetBase.ContainsKey(entityTypebase))
332-
{
333-
TypeByEntitySetBase.Add(entityTypebase, elementType);
334-
}
354+
TypeByEntitySetBase.Add(entityTypebase, elementType);
335355
}
356+
}
336357

337-
// TypeByDbSet
358+
// TypeByDbSet
359+
{
360+
var baseType = elementType;
361+
362+
var types = new List<Type>();
363+
while (baseType != null && baseType != typeof(object))
338364
{
339-
var baseType = elementType;
365+
types.Add(baseType);
340366

341-
var types = new List<Type>();
342-
while (baseType != null && baseType != typeof(object))
367+
// LINK interface
368+
var interfaces = baseType.GetInterfaces();
369+
foreach (var @interface in interfaces)
343370
{
344-
types.Add(baseType);
345-
346-
// LINK interface
347-
var interfaces = baseType.GetInterfaces();
348-
foreach (var @interface in interfaces)
349-
{
350-
types.Add(@interface);
351-
}
352-
353-
baseType = baseType.BaseType;
371+
types.Add(@interface);
354372
}
355373

356-
// ENSURE all discting
357-
types = types.Distinct().ToList();
374+
baseType = baseType.BaseType;
375+
}
358376

359-
if (!TypeByDbSet.ContainsKey(entityTypebase))
360-
{
361-
TypeByDbSet.Add(entityTypebase, types);
362-
}
377+
// ENSURE all discting
378+
types = types.Distinct().ToList();
379+
380+
if (!TypeByDbSet.ContainsKey(entityTypebase))
381+
{
382+
TypeByDbSet.Add(entityTypebase, types);
363383
}
364384
}
365385
}

version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v1.7.2
1+
v1.7.3

0 commit comments

Comments
 (0)