예제 #1
0
        public QueryExecutor(
            ISqlTableResolver tableResolver,
            IFromTableExecutorFactory fromTableExecutorFactory,
            IWhereExecutorFactory whereExecutorFactory,
            IGroupByExecutorFactory groupByExecutorFactory,
            ISelectExecutorFactory selectExecutorFactory,
            IOrderByExecutorFactory orderByExecutorFactory,
            IOffsetExecutorFactory offsetExecutorFactory,
            IDistinctExecutorFactory distinctExecutorFactory,
            IAggregateFunctionExecutorFactory aggregateFunctionExecutorFactory
            )
        {
            Debug.Assert(tableResolver != null);
            Debug.Assert(fromTableExecutorFactory != null);
            Debug.Assert(whereExecutorFactory != null);
            Debug.Assert(groupByExecutorFactory != null);
            Debug.Assert(selectExecutorFactory != null);
            Debug.Assert(orderByExecutorFactory != null);
            Debug.Assert(offsetExecutorFactory != null);
            Debug.Assert(distinctExecutorFactory != null);
            Debug.Assert(aggregateFunctionExecutorFactory != null);

            _tableResolver                    = tableResolver;
            _fromTableExecutorFactory         = fromTableExecutorFactory;
            _whereExecutorFactory             = whereExecutorFactory;
            _groupByExecutorFactory           = groupByExecutorFactory;
            _selectExecutorFactory            = selectExecutorFactory;
            _orderByExecutorFactory           = orderByExecutorFactory;
            _offsetExecutorFactory            = offsetExecutorFactory;
            _distinctExecutorFactory          = distinctExecutorFactory;
            _aggregateFunctionExecutorFactory = aggregateFunctionExecutorFactory;
        }
예제 #2
0
        public override async ValueTask <IQueryable <Entity> > GetTable(ISqlTableResolver tableResolver, ExecuteFromTableStage executeFromTableStage, object additionalData)
        {
            QueryOptions queryOptions = new QueryOptions(
                executeFromTableStage.ParameterExpression,
                executeFromTableStage.SelectExpression,
                executeFromTableStage.WhereExpression,
                executeFromTableStage.Limit,
                executeFromTableStage.Offset,
                executeFromTableStage.ContainsFullTextSearch,
                executeFromTableStage.Parameters);

            var queryable = (IQueryable <Entity>) await tableResolver.ResolveTableName(executeFromTableStage.TableName, additionalData, queryOptions);

            //Check that we are not using any in memory queryable, since this select will only cost extra operations
            //without any gain
            if (!((queryable is EnumerableQuery) || (queryable is Array)) && queryOptions.TryGetSelectExpression <Entity>(out var select))
            {
                queryable = queryable.Select(select);
            }

            if (queryOptions.TryGetWhereExpression <Entity>(out var where))
            {
                queryable = queryable.Where(where);
            }

            if (queryOptions.TryGetOffset(out var offset))
            {
                queryable = queryable.Skip(offset);
            }

            if (queryOptions.TryGetLimit(out var limit))
            {
                queryable = queryable.Take(limit);
            }

            return(queryable);
        }
예제 #3
0
 public abstract ValueTask <IQueryable <Entity> > GetTable(ISqlTableResolver tableResolver, ExecuteFromTableStage executeFromTableStage, object additionalData);
예제 #4
0
 public async ValueTask <IQueryable> Execute(ISqlTableResolver tableResolver, ExecuteFromTableStage executeFromTableStage, object additionalData)
 {
     return(await GetTable(tableResolver, executeFromTableStage, additionalData));
 }