/// <summary>
        /// Factory method that creates a new instance of the QueryRepository.
        /// </summary>
        /// <param name="entityModelSchema">Entity Model Schema</param>
        /// <param name="queryTypeLibrary">Query Type Library</param>
        /// <param name="entityContainerData">Entity Container Data</param>
        /// <returns>An instance of the QueryRepository class.</returns>
        public virtual QueryRepository CreateQueryRepository(EntityModelSchema entityModelSchema, QueryTypeLibrary queryTypeLibrary, EntityContainerData entityContainerData)
        {
            this.RootDataTypes = new Dictionary<string, QueryStructuralType>();

            this.BuildPrimitiveTypes(queryTypeLibrary);
            this.BuildRootQueriesAndTypes(entityModelSchema, queryTypeLibrary);

            var dataSet = this.DataSetBuilder.Build(this.RootDataTypes, entityContainerData);

            this.BuildConstants(queryTypeLibrary, dataSet);

            QueryRepository repository = new QueryRepository(queryTypeLibrary, this.RootQueries, this.Constants, this.PrimitiveTypes, this.RootDataTypes, dataSet);

            return repository;
        }
        private void FindEntitiesWithStreams(QueryRepository repository)
        {
            // Lambdas inside a Linq to objects query cannot refer to extension methods defined on types derived from non-system types.
            var streamRootQueries = repository.RootQueries.Collections<QueryStructuralType>();

            foreach (var rootQuery in streamRootQueries)
            {
                QueryEntityType type = rootQuery.ExpressionType.ElementType as QueryEntityType;
                ExceptionUtilities.CheckObjectNotNull(type, "Type was not an entity type. Type was {0}", type.StringRepresentation);
                if (rootQuery.Expression.IsRootEntitySetQuery())
                {
                    if (!type.Properties.Streams().Any())
                    {
                        continue;
                    }

                    var entitySetRightsAnnotation = type.EntitySet.Annotations.OfType<EntitySetRightsAnnotation>().SingleOrDefault();
                    
                    // Skipping streams generation if EntitySetRights are not all
                    if (entitySetRightsAnnotation != null && entitySetRightsAnnotation.Value != EntitySetRights.All)
                    {
                        continue;
                    }

                    var existing = this.QueryRepository.DataSet[type.EntitySet.Name];
                    ExceptionUtilities.Assert(existing != null, "Existing collection should not be null");

                    int i = 0;
                    foreach (var qv in existing.Elements)
                    {
                        var qsv = qv as QueryStructuralValue;
                        ExceptionUtilities.CheckObjectNotNull(qsv, "Should only be query structural value");

                        if (qsv.Type.Properties.Streams().Any())
                        {
                            i++;
                            this.queryStructuralValuesToAddStreamsTo.Add(qsv);
                            this.queryStructuralValueToRootQueryLookup.Add(qsv, rootQuery.Expression);
                        }
                    }

                    if (i > 0)
                    {
                        this.Logger.WriteLine(LogLevel.Verbose, "Adding streams to '{0}' entity Instances in Entity Set '{1}'", i, type.EntitySet.Name);
                    }
                }
            }
        }
 /// <summary>
 /// Initializes a new instance of the ClrBasedQueryProvider type
 /// </summary>
 /// <param name="clrTypesAssembly">The assembly which contains the clr types for resource types</param>
 /// <param name="modelSchema">The schema for the model under test</param>
 /// <param name="evaluator">The evaluator to evaluate queries created after resolution</param>
 /// <param name="repository">The query repository to find root queries in</param>
 public ClrBasedQueryProvider(Assembly clrTypesAssembly, EntityModelSchema modelSchema, IQueryExpressionEvaluator evaluator, QueryRepository repository)
 {
     this.clrTypesAssembly = clrTypesAssembly;
     this.modelSchema = modelSchema;
     this.evaluator = evaluator;
     this.queryRepository = repository;
 }