internal AggregateQueryable(IAggregateFluent <TEntity> aggregate, IMongoQueryable <TEntity> queryable) { aggregate.NotNull(nameof(aggregate)); queryable.NotNull(nameof(queryable)); queryable.ElementType.NotNull(nameof(queryable.ElementType)); queryable.Expression.NotNull(nameof(queryable.Expression)); aggregateQueryProvider = new AggregateQueryProvider <TEntity>(queryable, this, aggregate); ElementType = queryable.ElementType; Expression = queryable.Expression; }
public static IAggregateQueryable <TEntity> AsAggregateQueryable <TEntity>(this IMongoQueryable <TEntity> queryable) { queryable.NotNull(nameof(queryable)); var type = queryable.Provider.GetType().GetTypeInfo(); var collectionField = type.GetField("_collection", BindingFlags.Instance | BindingFlags.NonPublic); var optionsField = type.GetField("_options", BindingFlags.Instance | BindingFlags.NonPublic); if (!(collectionField?.GetValue(queryable.Provider) is IMongoCollection <TEntity> collection)) { throw new NotSupportedException("This type of IMongoQueryable<> dose not support converting to IAggregateQueryable<>"); } if (!(optionsField?.GetValue(queryable.Provider) is AggregateOptions options)) { throw new NotSupportedException("This type of IMongoQueryable<> dose not support converting to IAggregateQueryable<>"); } var aggregate = collection.Aggregate(options); return(new AggregateQueryable <TEntity>(aggregate, queryable)); }