Ejemplo n.º 1
0
            protected override Expression VisitEntityQueryable(Type elementType)
            {
                var relationalQueryCompilationContext = ((RelationalQueryCompilationContext)QueryCompilationContext);
                var queryMethodInfo = relationalQueryCompilationContext.EnumerableMethodProvider.QueryValues;
                var entityType      = QueryCompilationContext.Model.GetEntityType(elementType);

                var selectExpression
                    = new SelectExpression(elementType)
                    {
                    TableSource = entityType.StorageName
                    };

                _queryModelVisitor._queriesBySource.Add(_querySource, selectExpression);

                if (_queryModelVisitor.QuerySourceRequiresMaterialization(_querySource))
                {
                    foreach (var property in entityType.Properties)
                    {
                        selectExpression.AddToProjection(property);
                    }

                    queryMethodInfo
                        = relationalQueryCompilationContext.EnumerableMethodProvider.QueryEntities
                          .MakeGenericMethod(elementType);
                }

                return(Expression.Call(
                           queryMethodInfo,
                           QueryContextParameter,
                           Expression.Constant(new CommandBuilder(selectExpression, relationalQueryCompilationContext))));
            }
            protected override Expression VisitEntityQueryable(Type elementType)
            {
                var relationalQueryCompilationContext = ((RelationalQueryCompilationContext)QueryCompilationContext);
                var queryMethodInfo = CreateValueReaderMethodInfo;
                var entityType      = QueryCompilationContext.Model.GetEntityType(elementType);

                var selectExpression = new SelectExpression();
                var tableName        = entityType.TableName();

                selectExpression
                .AddTable(
                    new TableExpression(
                        tableName,
                        entityType.Schema(),
                        _querySource.ItemName.StartsWith("<generated>_")
                                ? tableName.First().ToString().ToLower()
                                : _querySource.ItemName,
                        _querySource));

                _queryModelVisitor._queriesBySource.Add(_querySource, selectExpression);

                var queryMethodArguments
                    = new List <Expression>
                    {
                    Expression.Constant(_querySource),
                    QueryContextParameter,
                    QuerySourceScopeParameter,
                    _readerParameter
                    };

                if (_queryModelVisitor.QuerySourceRequiresMaterialization(_querySource))
                {
                    foreach (var property in entityType.Properties)
                    {
                        selectExpression.AddToProjection(property, _querySource);
                    }

                    queryMethodInfo = CreateEntityMethodInfo.MakeGenericMethod(elementType);
                    queryMethodArguments.Add(Expression.Constant(0));
                }

                return(Expression.Call(
                           relationalQueryCompilationContext.QueryMethodProvider.QueryMethod
                           .MakeGenericMethod(queryMethodInfo.ReturnType),
                           QueryContextParameter,
                           Expression.Constant(new CommandBuilder(selectExpression, relationalQueryCompilationContext)),
                           Expression.Lambda(
                               Expression.Call(queryMethodInfo, queryMethodArguments),
                               _readerParameter)));
            }
            protected override Expression VisitEntityQueryable(Type elementType)
            {
                var queryMethodInfo = _queryModelVisitor._enumerableMethodProvider.QueryValues;
                var entityType      = QueryCompilationContext.Model.GetEntityType(elementType);

                var entityQuery = new SqlSelect().SetTableSource(entityType.StorageName);

                _queryModelVisitor._queriesBySource.Add(_querySource, entityQuery);

                if (_queryModelVisitor.QuerySourceRequiresMaterialization(_querySource))
                {
                    foreach (var property in entityType.Properties)
                    {
                        entityQuery.AddToProjection(property);
                    }

                    queryMethodInfo
                        = _queryModelVisitor._enumerableMethodProvider.QueryEntities
                          .MakeGenericMethod(elementType);
                }

                return(Expression.Call(
                           queryMethodInfo, QueryContextParameter, Expression.Constant(entityQuery)));
            }