public void CheckCtors()
        {
            var strategy1 = new ReverseQueryStrategy();
            var strategy2 = new ReverseQueryStrategy();

            var aggregate = new AggregateQueryStrategy(strategy1, strategy2);
            aggregate.Aggregates.Count().ShouldEqual(2);

            aggregate = new AggregateQueryStrategy(new[] { strategy1, strategy2 }.ToList());
            aggregate.Aggregates.Count().ShouldEqual(2);
        }
        public void GetEntities()
        {
            Expression<Func<Parent, bool>> isabelleExpression = p => p.Id == Names.IsabelleOsborne;
            var additionalQueryData = "DummyData";

            var recorder = new InMemoryRecordedQueryRepository(Persons);
            var reverseStrategy = new ReverseQueryStrategy();
            var reverseStrategy2 = new ReverseQueryStrategy();

            //public IQueryable<T> GetEntities<T>();
            CallAndAssertGetEntities(() => recorder.GetEntities<Person>(), recorder, specificationStrategy: DefaultSpecificationStrategyType, expectedCount: 11);
            CallAndAssertGetEntities(() => recorder.GetEntities<Child>(), recorder, specificationStrategy: typeof(DefaultSpecificationQueryStrategy<Child>), expectedCount: 5);

            //public IQueryable<T> GetEntities<T>(object additionalQueryData);
            CallAndAssertGetEntities(() => recorder.GetEntities<Parent>(additionalQueryData), recorder, specificationStrategy: typeof(DefaultSpecificationQueryStrategy<Parent>), additionalQueryData: additionalQueryData);

            //public IQueryable<T> GetEntities<T>(params IQueryStrategy[] queryStrategy);
            CallAndAssertGetEntities(() => recorder.GetEntities<Parent>(reverseStrategy, reverseStrategy2), recorder, specificationStrategy: typeof(DefaultSpecificationQueryStrategy<Parent>), queryStrategy: typeof(AggregateQueryStrategy));

            //public IQueryable<T> GetEntities<T>(Expression<Func<T, bool>> predicate);
            CallAndAssertGetEntities(() => recorder.GetEntities<Parent>(isabelleExpression), recorder, expectedCount: 1);

            //public IQueryable<T> GetEntities<T>(Expression<Func<T, bool>> predicate, params IQueryStrategy[] queryStrategies);
            CallAndAssertGetEntities(() => recorder.GetEntities<Parent>(isabelleExpression, reverseStrategy, reverseStrategy2), recorder, queryStrategy: typeof(AggregateQueryStrategy), expectedCount: 1);

            //public IQueryable<T> GetEntities<T>(ISpecificationQueryStrategy<T> specification);
            CallAndAssertGetEntities(() => recorder.GetEntities<Parent>(ParentExpressionSpecificationStrategy), recorder, expectedCount: 1);

            //public IQueryable<T> GetEntities<T>(ISpecificationQueryStrategy<T> specification, params IQueryStrategy[] queryStrategies);
            CallAndAssertGetEntities(() => recorder.GetEntities<Parent>(ParentExpressionSpecificationStrategy, reverseStrategy, reverseStrategy2), recorder, queryStrategy: typeof(AggregateQueryStrategy), expectedCount: 1);

            //public IQueryable<T> GetEntities<T>(object additionalQueryData, params IQueryStrategy[] queryStrategy);
            CallAndAssertGetEntities(() => recorder.GetEntities<Parent>(additionalQueryData, reverseStrategy, reverseStrategy2), recorder, specificationStrategy: typeof(DefaultSpecificationQueryStrategy<Parent>), queryStrategy: typeof(AggregateQueryStrategy), additionalQueryData: additionalQueryData);

            //public IQueryable<T> GetEntities<T>(object additionalQueryData, Expression<Func<T, bool>> predicate);
            CallAndAssertGetEntities(() => recorder.GetEntities<Parent>(additionalQueryData, isabelleExpression), recorder, additionalQueryData: additionalQueryData, expectedCount: 1);

            //public IQueryable<T> GetEntities<T>(object additionalQueryData, Expression<Func<T, bool>> predicate, params IQueryStrategy[] queryStrategies);
            CallAndAssertGetEntities(() => recorder.GetEntities<Parent>(additionalQueryData, reverseStrategy, reverseStrategy2), recorder, specificationStrategy: typeof(DefaultSpecificationQueryStrategy<Parent>), queryStrategy: typeof(AggregateQueryStrategy), additionalQueryData: additionalQueryData);

            //public IQueryable<T> GetEntities<T>(object additionalQueryData, ISpecificationQueryStrategy<T> specification);
            CallAndAssertGetEntities(() => recorder.GetEntities<Parent>(additionalQueryData, ParentExpressionSpecificationStrategy), recorder, additionalQueryData: additionalQueryData, expectedCount: 1);

            //public IQueryable<T> GetEntities<T>(object additionalQueryData, ISpecificationQueryStrategy<T> specification, params IQueryStrategy[] queryStrategies);
            CallAndAssertGetEntities(() => recorder.GetEntities<Parent>(ParentExpressionSpecificationStrategy, reverseStrategy, reverseStrategy2), recorder, queryStrategy: typeof(AggregateQueryStrategy), expectedCount: 1);

            //public IQueryable<T> GetEntities<T>(object additionalQueryData, ISpecificationQueryStrategy<T> specification, IQueryStrategy queryStrategy);
            CallAndAssertGetEntities(() => recorder.GetEntities<Parent>(additionalQueryData, ParentExpressionSpecificationStrategy, reverseStrategy), recorder, queryStrategy: typeof(ReverseQueryStrategy), expectedCount: 1, additionalQueryData: additionalQueryData);

            //recorder.GetEntity<Person>(object additionalQueryData, ISpecificationQueryStrategy<T> specification, params IQueryStrategy[] queryStrategies);
            CallAndAssertGetEntities(() => recorder.GetEntities<Person>(additionalQueryData, ExpressionSpecificationStrategy, new OrderByQueryStrategy<Person>(), new OrderByQueryStrategy<Person>()), recorder, specificationStrategy: ExpressionSpecificationStrategy.GetType(), queryStrategy: typeof(AggregateQueryStrategy), additionalQueryData: additionalQueryData, expectedCount: 1);

            // public IQueryable<T> GetEntities<T>(object additionalQueryData, Expression<Func<T, bool>> predicate, params IQueryStrategy[] queryStrategies) where T : class
            CallAndAssertGetEntities(() => recorder.GetEntities<Person>(additionalQueryData, p => p.Id == Names.IsabelleOsborne, new OrderByQueryStrategy<Person>(), new OrderByQueryStrategy<Person>()), recorder, specificationStrategy: ExpressionSpecificationStrategy.GetType(), queryStrategy: typeof(AggregateQueryStrategy), additionalQueryData: additionalQueryData, expectedCount: 1);

            // IQueryable<T> GetQueryableEntities<T>(object additionalQueryData) where T : class
            // CallAndAssertGetEntities(() => recorder.GetQueryableEntities<Person>(additionalQueryData), recorder, specificationStrategy: typeof(DefaultSpecificationQueryStrategy<Person>), queryStrategy: typeof(DefaultQueryStrategy), additionalQueryData: additionalQueryData, expectedCount: 11);
        }