protected override ShapedQueryExpression?TranslateCast(
     ShapedQueryExpression source,
     Type resultType)
 => null;
 protected override ShapedQueryExpression TranslateGroupJoin(ShapedQueryExpression outer, ShapedQueryExpression inner, LambdaExpression outerKeySelector, LambdaExpression innerKeySelector, LambdaExpression resultSelector)
 => null;
        protected override ShapedQueryExpression TranslateJoin(ShapedQueryExpression outer, ShapedQueryExpression inner, LambdaExpression outerKeySelector, LambdaExpression innerKeySelector, LambdaExpression resultSelector)
        {
            outerKeySelector = TranslateLambdaExpression(outer, outerKeySelector);
            innerKeySelector = TranslateLambdaExpression(inner, innerKeySelector);
            if (outerKeySelector == null || innerKeySelector == null)
            {
                return(null);
            }

            (outerKeySelector, innerKeySelector) = AlignKeySelectorTypes(outerKeySelector, innerKeySelector);

            var transparentIdentifierType = TransparentIdentifierFactory.Create(
                resultSelector.Parameters[0].Type,
                resultSelector.Parameters[1].Type);

            ((InMemoryQueryExpression)outer.QueryExpression).AddInnerJoin(
                (InMemoryQueryExpression)inner.QueryExpression,
                outerKeySelector,
                innerKeySelector,
                transparentIdentifierType);

            return(TranslateResultSelectorForJoin(
                       outer,
                       resultSelector,
                       inner.ShaperExpression,
                       transparentIdentifierType));
        }
예제 #4
0
 protected override ShapedQueryExpression TranslateCast(ShapedQueryExpression source, Type resultType) => throw new NotImplementedException();
 protected override ShapedQueryExpression TranslateAverage(ShapedQueryExpression source, LambdaExpression selector, Type resultType)
 => TranslateScalarAggregate(source, selector, nameof(Enumerable.Average));
예제 #6
0
 protected override ShapedQueryExpression TranslateLeftJoin(ShapedQueryExpression outer, ShapedQueryExpression inner, LambdaExpression outerKeySelector, LambdaExpression innerKeySelector, LambdaExpression resultSelector)
 {
     throw new NotImplementedException();
 }
예제 #7
0
 protected override ShapedQueryExpression TranslateSelectMany(ShapedQueryExpression source, LambdaExpression selector) => throw new NotImplementedException();
        protected override ShapedQueryExpression TranslateLeftJoin(ShapedQueryExpression outer, ShapedQueryExpression inner, LambdaExpression outerKeySelector, LambdaExpression innerKeySelector, LambdaExpression resultSelector)
        {
            outerKeySelector = TranslateLambdaExpression(outer, outerKeySelector);
            innerKeySelector = TranslateLambdaExpression(inner, innerKeySelector);

            var transparentIdentifierType = TransparentIdentifierFactory.Create(
                resultSelector.Parameters[0].Type,
                resultSelector.Parameters[1].Type);

            ((InMemoryQueryExpression)outer.QueryExpression).AddLeftJoin(
                (InMemoryQueryExpression)inner.QueryExpression,
                outerKeySelector,
                innerKeySelector,
                transparentIdentifierType);

            return(TranslateResultSelectorForJoin(
                       outer,
                       resultSelector,
                       MarkShaperNullable(inner.ShaperExpression),
                       transparentIdentifierType));
        }
        protected override ShapedQueryExpression TranslateGroupJoin(ShapedQueryExpression outer, ShapedQueryExpression inner, LambdaExpression outerKeySelector, LambdaExpression innerKeySelector, LambdaExpression resultSelector)
        {
            //var outerSelectExpression = (SelectExpression)outer.QueryExpression;
            //if (outerSelectExpression.Limit != null
            //    || outerSelectExpression.Offset != null
            //    || outerSelectExpression.IsDistinct)
            //{
            //    outerSelectExpression.PushdownIntoSubQuery();
            //}

            //var innerSelectExpression = (SelectExpression)inner.QueryExpression;
            //if (innerSelectExpression.Orderings.Any()
            //    || innerSelectExpression.Limit != null
            //    || innerSelectExpression.Offset != null
            //    || innerSelectExpression.IsDistinct
            //    || innerSelectExpression.Predicate != null
            //    || innerSelectExpression.Tables.Count > 1)
            //{
            //    innerSelectExpression.PushdownIntoSubQuery();
            //}

            //var joinPredicate = CreateJoinPredicate(outer, outerKeySelector, inner, innerKeySelector);
            //if (joinPredicate != null)
            //{
            //    outer = TranslateThenBy(outer, outerKeySelector, true);

            //    var innerTransparentIdentifierType = CreateTransparentIdentifierType(
            //        resultSelector.Parameters[0].Type,
            //        resultSelector.Parameters[1].Type.TryGetSequenceType());

            //    outerSelectExpression.AddLeftJoin(
            //        innerSelectExpression, joinPredicate, innerTransparentIdentifierType);

            //    return TranslateResultSelectorForGroupJoin(
            //        outer,
            //        inner.ShaperExpression,
            //        outerKeySelector,
            //        innerKeySelector,
            //        resultSelector,
            //        innerTransparentIdentifierType);
            //}

            throw new NotImplementedException();
        }
 protected override ShapedQueryExpression?TranslateDefaultIfEmpty(
     ShapedQueryExpression source,
     Expression defaultValue)
 => null;
 protected override ShapedQueryExpression?TranslateDistinct(
     ShapedQueryExpression source)
 => null;
 protected override ShapedQueryExpression?TranslateCount(
     ShapedQueryExpression source,
     LambdaExpression predicate)
 => null;
 protected override ShapedQueryExpression?TranslateContains(
     ShapedQueryExpression source,
     Expression item)
 => null;
 protected override ShapedQueryExpression?TranslateConcat(
     ShapedQueryExpression source1,
     ShapedQueryExpression source2)
 => null;
예제 #15
0
 protected override ShapedQueryExpression TranslateElementAtOrDefault(ShapedQueryExpression source, Expression index, bool returnDefault) => throw new NotImplementedException();
        protected override ShapedQueryExpression TranslateLeftJoin(ShapedQueryExpression outer, ShapedQueryExpression inner, LambdaExpression outerKeySelector, LambdaExpression innerKeySelector, LambdaExpression resultSelector)
        {
            var joinPredicate = CreateJoinPredicate(outer, outerKeySelector, inner, innerKeySelector);

            if (joinPredicate != null)
            {
                var transparentIdentifierType = CreateTransparentIdentifierType(
                    resultSelector.Parameters[0].Type,
                    resultSelector.Parameters[1].Type);

                ((SelectExpression)outer.QueryExpression).AddLeftJoin(
                    (SelectExpression)inner.QueryExpression, joinPredicate, transparentIdentifierType);

                return(TranslateResultSelectorForJoin(
                           outer,
                           resultSelector,
                           inner.ShaperExpression,
                           transparentIdentifierType,
                           true));
            }

            throw new NotImplementedException();
        }
예제 #17
0
 protected override ShapedQueryExpression TranslateGroupBy(ShapedQueryExpression source, LambdaExpression keySelector, LambdaExpression elementSelector, LambdaExpression resultSelector) => throw new NotImplementedException();
        protected override ShapedQueryExpression TranslateUnion(ShapedQueryExpression source1, ShapedQueryExpression source2)
        {
            var operand1 = (SelectExpression)source1.QueryExpression;
            var operand2 = (SelectExpression)source2.QueryExpression;

            source1.ShaperExpression = operand1.ApplySetOperation(SetOperationType.Union, operand2, source1.ShaperExpression);
            return(source1);
        }
예제 #19
0
 protected override ShapedQueryExpression TranslateReverse(ShapedQueryExpression source) => throw new NotImplementedException();
 /// <summary>
 ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
 ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
 ///     any release. You should only use it directly in your code with extreme caution and knowing that
 ///     doing so can result in application failures when updating to a new Entity Framework Core release.
 /// </summary>
 protected override ShapedQueryExpression TranslateContains(ShapedQueryExpression source, Expression item)
 {
     throw new NotImplementedException();
 }
예제 #21
0
 protected override ShapedQueryExpression TranslateTakeWhile(ShapedQueryExpression source, LambdaExpression predicate) => throw new NotImplementedException();
        /// <summary>
        ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
        ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
        ///     any release. You should only use it directly in your code with extreme caution and knowing that
        ///     doing so can result in application failures when updating to a new Entity Framework Core release.
        /// </summary>
        protected override ShapedQueryExpression TranslateDistinct(ShapedQueryExpression source)
        {
            ((SelectExpression)source.QueryExpression).ApplyDistinct();

            return(source);
        }
예제 #23
0
 protected override ShapedQueryExpression TranslateConcat(ShapedQueryExpression source1, ShapedQueryExpression source2) => throw new NotImplementedException();
 /// <summary>
 ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
 ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
 ///     any release. You should only use it directly in your code with extreme caution and knowing that
 ///     doing so can result in application failures when updating to a new Entity Framework Core release.
 /// </summary>
 protected override ShapedQueryExpression TranslateIntersect(ShapedQueryExpression source1, ShapedQueryExpression source2)
 {
     throw new NotImplementedException();
 }
 protected override ShapedQueryExpression TranslateElementAtOrDefault(ShapedQueryExpression source, Expression index, bool returnDefault)
 => null;
 /// <summary>
 ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
 ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
 ///     any release. You should only use it directly in your code with extreme caution and knowing that
 ///     doing so can result in application failures when updating to a new Entity Framework Core release.
 /// </summary>
 protected override ShapedQueryExpression TranslateSelectMany(ShapedQueryExpression source, LambdaExpression collectionSelector, LambdaExpression resultSelector)
 {
     throw new NotImplementedException();
 }
 protected override ShapedQueryExpression TranslateIntersect(ShapedQueryExpression source1, ShapedQueryExpression source2)
 => TranslateSetOperation(InMemoryLinqOperatorProvider.Intersect, source1, source2);
예제 #28
0
 protected override ShapedQueryExpression TranslateDefaultIfEmpty(ShapedQueryExpression source, Expression defaultValue) => throw new NotImplementedException();
        protected override Expression VisitShapedQuery(ShapedQueryExpression shapedQueryExpression)
        {
            Check.NotNull(shapedQueryExpression, nameof(shapedQueryExpression));

            var jObjectParameter = Expression.Parameter(typeof(JObject), "jObject");

            var shaperBody = shapedQueryExpression.ShaperExpression;

            shaperBody = new JObjectInjectingExpressionVisitor().Visit(shaperBody);
            shaperBody = InjectEntityMaterializers(shaperBody);

            switch (shapedQueryExpression.QueryExpression)
            {
            case SelectExpression selectExpression:

                shaperBody = new CosmosProjectionBindingRemovingExpressionVisitor(
                    selectExpression, jObjectParameter,
                    QueryCompilationContext.QueryTrackingBehavior == QueryTrackingBehavior.TrackAll)
                             .Visit(shaperBody);

                var shaperLambda = Expression.Lambda(
                    shaperBody,
                    QueryCompilationContext.QueryContextParameter,
                    jObjectParameter);

                return(Expression.New(
                           typeof(QueryingEnumerable <>).MakeGenericType(shaperLambda.ReturnType).GetConstructors()[0],
                           Expression.Convert(
                               QueryCompilationContext.QueryContextParameter,
                               typeof(CosmosQueryContext)),
                           Expression.Constant(_sqlExpressionFactory),
                           Expression.Constant(_querySqlGeneratorFactory),
                           Expression.Constant(selectExpression),
                           Expression.Constant(shaperLambda.Compile()),
                           Expression.Constant(_contextType),
                           Expression.Constant(_partitionKeyFromExtension, typeof(string)),
                           Expression.Constant(
                               QueryCompilationContext.QueryTrackingBehavior == QueryTrackingBehavior.NoTrackingWithIdentityResolution),
                           Expression.Constant(_threadSafetyChecksEnabled)));

            case ReadItemExpression readItemExpression:

                shaperBody = new CosmosProjectionBindingRemovingReadItemExpressionVisitor(
                    readItemExpression, jObjectParameter,
                    QueryCompilationContext.QueryTrackingBehavior == QueryTrackingBehavior.TrackAll)
                             .Visit(shaperBody);

                var shaperReadItemLambda = Expression.Lambda(
                    shaperBody,
                    QueryCompilationContext.QueryContextParameter,
                    jObjectParameter);

                return(Expression.New(
                           typeof(ReadItemQueryingEnumerable <>).MakeGenericType(shaperReadItemLambda.ReturnType).GetConstructors()[0],
                           Expression.Convert(
                               QueryCompilationContext.QueryContextParameter,
                               typeof(CosmosQueryContext)),
                           Expression.Constant(readItemExpression),
                           Expression.Constant(shaperReadItemLambda.Compile()),
                           Expression.Constant(_contextType),
                           Expression.Constant(
                               QueryCompilationContext.QueryTrackingBehavior == QueryTrackingBehavior.NoTrackingWithIdentityResolution),
                           Expression.Constant(_threadSafetyChecksEnabled)));

            default:
                throw new NotSupportedException(CoreStrings.UnhandledExpressionNode(shapedQueryExpression.QueryExpression));
            }
        }
 protected override ShapedQueryExpression?TranslateAverage(
     ShapedQueryExpression source,
     LambdaExpression selector,
     Type resultType)
 => null;