Я создаю запрос LINQ динамически, и пока все в порядке.
Но я застрял там, где думал, что не буду.В определенный момент при создании этого запроса мне нужно получить доступ к EnityCollection объекта.Примерно так:
Expression collection = Expression.Property(entity, typeof(EntityType).GetProperty("CollectionOfRelatedEntities"));
Затем я бы вызвал метод LINQ "Где" для этой коллекции:
MethodCallExpression AfterWhere = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { typeof(RelatedEntity) },
collection,
Expression.Lambda<Func<RelatedEntity, bool>>(predicate, new ParameterExpression[] { paramOfRelatedEntity }));
И обычно это будет работать.В этом случае это не так, потому что коллекция IEnumerable, и мне нужно, чтобы она была IQueryable для того, чтобы «Где» работать.
Я пробовал это:
Expression.Convert(collection, typeof(IQueryable<RelatedEntity>);
, но он говорит, что не можетприведение, потому что EntityCollection не реализует IQueryable.
Я статически использую AsQueryable для достижения того, что мне нужно, поэтому я попытался имитировать это динамически:
Expression.Call(collection, typeof(EntityCollection<RelatedEntity>).GetMethod("AsQueryable"));
, но я получаю исключение нулевой ссылки.Я не могу достичь этого через отражение.Этот метод AsQueryable является методом расширения, он является статическим, определенным в классе Queryable, поэтому я попытался:
Expression.Call(collection, typeof(Queryable).GetMethod("AsQueryable", BindingFlags.Static));
Тот же результат: «Значение не может быть нулевым».
Я достигаю своих пределовздесь, и я только что из идей.
Итак, я спрашиваю вас:
Как я могу динамически приводить IEnumerable к IQueryable?