Skip to content

Commit e6268a7

Browse files
InvokeRunMethod implementation
1 parent 4b047d2 commit e6268a7

File tree

2 files changed

+9
-12
lines changed

2 files changed

+9
-12
lines changed

QueryExecutor.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,18 @@ public static object[] Run<TSource, TTarget>(this IQueryable<TSource> source, Qu
3434
return db is not null ? BuildQuery<TSource, TTarget>(db, source, query, mapper).ToArray() : Array.Empty<object>();
3535
}
3636

37-
public static MethodInfo? GetRunMethod(Type executorType, Type[] genericArgs)
37+
public static object[] InvokeRunMethod(Type[] genericArgs, object?[] parameters)
3838
{
39-
return executorType
39+
var method = typeof(QueryExecutor)
4040
.GetMethods(BindingFlags.Static | BindingFlags.Public)
4141
.FirstOrDefault(m =>
4242
m.Name == "Run" &&
4343
m.IsGenericMethodDefinition &&
4444
m.GetGenericArguments().Length == genericArgs.Length)
4545
?.MakeGenericMethod(genericArgs);
46+
47+
var result = method?.Invoke(null, parameters) ?? Array.Empty<object>();
48+
return (object[])result;
4649
}
4750

4851
private static IQueryable<object> BuildQuery<TSource, TTarget>(DbContext db, IQueryable<TSource> source, Query? query, IMapper? mapper = null)
@@ -242,11 +245,10 @@ private static IEnumerable<dynamic> RunSubquery(DbContext db, Query? query)
242245
var method = methods?.FirstOrDefault(m => m.CustomAttributes.Count() == 1);
243246
var dbSet = prop.GetValue(db) ?? throw new ValidationException($"DbSet property '{prop.Name}' is null in DbContext.");
244247
var genericType = prop.PropertyType.GetGenericArguments().FirstOrDefault() ?? throw new ValidationException($"Missing DbSet generic type");
248+
var queryable = dbSet?.GetType().GetMethod("AsQueryable")?.Invoke(dbSet, null);
245249

246-
var genericMethod = GetRunMethod(typeof(QueryExecutor), [genericType]);
250+
return InvokeRunMethod([genericType], [queryable, query]);
247251

248-
var queryable = dbSet?.GetType().GetMethod("AsQueryable")?.Invoke(dbSet, null);
249-
return genericMethod?.Invoke(null, [queryable, query]) as IEnumerable<dynamic> ?? Array.Empty<dynamic>();
250252
}
251253

252254
private static dynamic? ProjectField(object? obj, string field)

Services/QueryBuilderService.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,11 @@ public Dictionary<string, object[]> RunQuery(Query query)
3030

3131
var dtoGenericType = resultProperty.PropertyType.GetElementType() ?? throw new ValidationException($"Missing Dto generic type");
3232

33-
var genericMethod = QueryExecutor.GetRunMethod(typeof(QueryExecutor), [dbGenericType, dtoGenericType]);
34-
3533
var queryable = dbSet.GetType().GetMethod("AsQueryable")?.Invoke(dbSet, null)
3634
?? throw new InvalidOperationException($"DbSet '{propInfo.Name}' does not support AsQueryable().");
37-
if ( genericMethod?.Invoke(null, [queryable, query, mapper]) is object[] propRes)
38-
{
39-
return new Dictionary<string, object[]> { { propInfo.Name.ToLowerInvariant(), propRes } };
40-
}
4135

42-
throw new InvalidOperationException($"Unknown entity {t}");
36+
var propRes = QueryExecutor.InvokeRunMethod([dbGenericType, dtoGenericType], [queryable, query, mapper]);
37+
return new Dictionary<string, object[]> { { propInfo.Name.ToLowerInvariant(), propRes } };
4338
}
4439
}
4540
}

0 commit comments

Comments
 (0)