public void GetEntity()
        {
            Expression<Func<Person, bool>> isabelleExpression = p => p.Id == Names.IsabelleOsborne;

            var recorder = new InMemoryRecordedQueryRepository(PersonsData.Data);

            //recorder.GetEntity<Person>(params IQueryStrategy[] queryStrategies);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(isabelleExpression), recorder, defaultQueryStrategy: typeof(AggregateQueryStrategy));

            //recorder.GetEntity<Person>(ISpecificationQueryStrategy<T> specification);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(ExpressionSpecificationStrategy), recorder, defaultQueryStrategy: typeof(AggregateQueryStrategy));

            //recorder.GetEntity<Person>(Expression<Func<T, bool>> predicate, bool throwExceptionIfZeroOrManyFound);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(ExpressionSpecificationStrategy, false), recorder, throwSearchException: false);

            //recorder.GetEntity<Person>(Expression<Func<T, bool>> predicate, IQueryStrategy queryStrategy, bool throwExceptionIfZeroOrManyFound);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(isabelleExpression, new OrderByQueryStrategy<Person>(), false), recorder,  throwSearchException: false);

            //recorder.GetEntity<Person>(Expression<Func<T, bool>> predicate, params IQueryStrategy[] queryStrategies);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(isabelleExpression, new OrderByQueryStrategy<Person>(), new OrderByQueryStrategy<Person>()), recorder);

            //recorder.GetEntity<Person>(ISpecificationQueryStrategy<T> specification, bool throwExceptionIfZeroOrManyFound);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(ExpressionSpecificationStrategy, false), recorder, throwSearchException: false);

            //recorder.GetEntity<Person>(ISpecificationQueryStrategy<T> specification, IQueryStrategy queryStrategy, bool throwExceptionIfZeroOrManyFound);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(ExpressionSpecificationStrategy, new OrderByQueryStrategy<Person>(), false), recorder, throwSearchException: false);

            //recorder.GetEntity<Person>(ISpecificationQueryStrategy<T> specification, params IQueryStrategy[] queryStrategies);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(ExpressionSpecificationStrategy, new OrderByQueryStrategy<Person>(), new OrderByQueryStrategy<Person>()), recorder);

            // public T GetEntity<T>(params IQueryStrategy[] queryStrategies) where T : class
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(new OrderByQueryStrategy<Person>(), new OrderByQueryStrategy<Person>()), recorder, expectException: true);

        }
        public void GetEntityWithadditionalQueryData()
        {
            Expression<Func<Person, bool>> isabelleExpression = p => p.Id == Names.IsabelleOsborne;
            var additionalQueryData = "DummyData";

            var recorder = new InMemoryRecordedQueryRepository(Persons);

            //recorder.GetEntity<Person>(object additionalQueryData, Expression<Func<T, bool>> predicate);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(additionalQueryData, isabelleExpression), recorder, additionalQueryData: additionalQueryData, defaultQueryStrategy: typeof(AggregateQueryStrategy));

            //recorder.GetEntity<Person>(object additionalQueryData, ISpecificationQueryStrategy<T> specification);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(additionalQueryData, ExpressionSpecificationStrategy), recorder, additionalQueryData: additionalQueryData);

            //recorder.GetEntity<Person>(object additionalQueryData, Expression<Func<T, bool>> predicate, bool throwExceptionIfZeroOrManyFound);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(additionalQueryData, ExpressionSpecificationStrategy, false), recorder, throwSearchException: false, additionalQueryData: additionalQueryData);

            //recorder.GetEntity<Person>(object additionalQueryData, Expression<Func<T, bool>> predicate, IQueryStrategy queryStrategy, bool throwExceptionIfZeroOrManyFound);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(additionalQueryData, isabelleExpression, new OrderByQueryStrategy<Person>(), false), recorder, queryStrategy: typeof(OrderByQueryStrategy<Person>), throwSearchException: false, additionalQueryData: additionalQueryData);

            //recorder.GetEntity<Person>(object additionalQueryData, Expression<Func<T, bool>> predicate, params IQueryStrategy[] queryStrategies);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(additionalQueryData, isabelleExpression, new OrderByQueryStrategy<Person>(), new OrderByQueryStrategy<Person>()), recorder, queryStrategy: typeof(AggregateQueryStrategy), additionalQueryData: additionalQueryData);

            //recorder.GetEntity<Person>(object additionalQueryData, ISpecificationQueryStrategy<T> specification, bool throwExceptionIfZeroOrManyFound);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(additionalQueryData, ExpressionSpecificationStrategy, false), recorder, throwSearchException: false, additionalQueryData: additionalQueryData);

            //recorder.GetEntity<Person>(object additionalQueryData, ISpecificationQueryStrategy<T> specification, IQueryStrategy queryStrategy, bool throwExceptionIfZeroOrManyFound);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(additionalQueryData, ExpressionSpecificationStrategy, new OrderByQueryStrategy<Person>(), false), recorder, queryStrategy: typeof(OrderByQueryStrategy<Person>), throwSearchException: false, additionalQueryData: additionalQueryData);

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

            // public T GetEntity<T>(object additionalQueryData, Expression<Func<T, bool>> predicate, bool throwExceptionIfZeroOrManyFound) 
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(additionalQueryData, p => p.Id == Names.IsabelleOsborne), recorder, additionalQueryData: additionalQueryData, defaultQueryStrategy: typeof(AggregateQueryStrategy));

            // public T GetEntity<T>(object additionalQueryData, params IQueryStrategy[] queryStrategies) where T : class
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(additionalQueryData, new OrderByQueryStrategy<Person>(), new OrderByQueryStrategy<Person>()), recorder, specificationStrategy: DefaultSpecificationStrategyType, queryStrategy: typeof(AggregateQueryStrategy), expectException: true, additionalQueryData: additionalQueryData);

            // public T GetEntity<T>(object additionalQueryData, IQueryStrategy queryStrategy, bool throwExceptionIfZeroOrManyFound) where T : class
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(additionalQueryData, new TakeQueryStrategy(1), false), recorder, specificationStrategy: DefaultSpecificationStrategyType, queryStrategy: typeof(TakeQueryStrategy), expectException: false, additionalQueryData: additionalQueryData, throwSearchException: false);

            // public T GetEntity<T>(object additionalQueryData, Expression<Func<T, bool>> predicate, bool throwExceptionIfZeroOrManyFound) where T : class
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(additionalQueryData, p => p.Id == Names.IsabelleOsborne, false), recorder, additionalQueryData: additionalQueryData, throwSearchException: false);
        }
        public void CheckEntitySearchRepositoryExceptionThrown()
        {
            var recorder = new InMemoryRecordedQueryRepository(Persons);
            CallAndAssertGetEntity(() => recorder.GetEntity<Person>(
                p => p.FirstName == "NotFound"),
                recorder,
                expectException: true,
                defaultQueryStrategy: typeof(AggregateQueryStrategy));

        }