/// <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; }