Вы не можете строить запросы, превышающие dynamic
, потому что это не поддерживается изначально в деревьях выражений. Вместо этого вы должны основывать свою работу на non generi c IQueryable
или generi c IQueryable<object>
. например, если ReflectionHelpers.GetDbCollectionByType
вызывает DbContext.Set<T>
динамически (аналогично здесь Таблица динамического доступа в EF Core 2.0 ), вы должны иметь возможность преобразовать его в IQueryable<object>
:
var items = (IQueryable<object>)ReflectionHelpers.GetDbCollectionByType(Db, collectionType);
Чтобы добавить предложение Where
, вы не должны использовать вызовы отражения внутри выражения предиката, а строите его динамически, используя методы класса Expression
(из пространства имен System.Linq.Expressions
). Примерно так:
// (object i) => (({collectionType})i).{ForeignKey} == Item.{PrimaryKey}
var parameter = Expression.Parameter(typeof(object), "i");
var body = Expression.Equal(
Expression.Property(Expression.Convert(parameter, collectionType), foreignKeyProperty),
Expression.Property(Expression.Constant(Item), PrimaryKeyProperty));
var predicate = Expression.Lambda<Func<object, bool>>(body, parameter);
а потом
items = items.Where(predicate); // still IQueryable<object>