示例#1
0
        private QueryValue VisitSingleExpression(LinqQueryMethodWithLambdaExpression expression, bool isOrDefault)
        {
            var source = this.EvaluateCollection(expression.Source);

            QueryCollectionValue collection = source;

            if (expression.Lambda != null)
            {
                collection = source.Where(v => this.EvaluateLambda <QueryScalarValue>(expression.Lambda, v));
            }

            if (collection.Elements.Count == 0)
            {
                if (isOrDefault)
                {
                    return(collection.Type.ElementType.NullValue);
                }
                else
                {
                    var expectedException = new ExpectedExceptions(new ExpectedExceptionTypeMessageVerifier <InvalidOperationException>(null, "Sequence contains no elements"));
                    return(source.Type.ElementType.CreateErrorValue(expectedException));
                }
            }
            else if (collection.Elements.Count == 1)
            {
                return(collection.Elements[0]);
            }
            else
            {
                var expectedException = new ExpectedExceptions(new ExpectedExceptionTypeMessageVerifier <InvalidOperationException>(null, "Sequence contains more than one element"));
                return(collection.Type.ElementType.CreateErrorValue(expectedException));
            }
        }
示例#2
0
        private QueryValue VisitFirstExpression(LinqQueryMethodWithLambdaExpression expression, bool isOrDefault)
        {
            var source = this.EvaluateCollection(expression.Source);

            IEnumerable <QueryValue> elements = source.Elements;

            if (expression.Lambda != null)
            {
                // Note: cannot directly use souce.Where(...) since underlying store semantics might change order!
                elements = source.Elements.Where(v =>
                {
                    QueryScalarValue predicate = this.EvaluateLambda <QueryScalarValue>(expression.Lambda, v);
                    return(!predicate.IsNull && (bool)predicate.Value);
                }).ToArray();
            }

            if (elements.Count() == 0)
            {
                if (isOrDefault)
                {
                    return(source.Type.ElementType.NullValue);
                }
                else
                {
                    var expectedException = new ExpectedExceptions(new ExpectedExceptionTypeMessageVerifier <InvalidOperationException>(null, "Sequence contains no elements"));
                    return(source.Type.ElementType.CreateErrorValue(expectedException));
                }
            }
            else
            {
                return(elements.First());
            }
        }
示例#3
0
        private QueryExpression VisitQueryMethodWithLambdaExpression(
            LinqQueryMethodWithLambdaExpression expression,
            Func <QueryExpression, LinqLambdaExpression, QueryType, QueryExpression> linqBuilderCall)
        {
            QueryExpression source = this.ReplaceExpression(expression.Source);

            if (expression.Lambda != null)
            {
                var lambda = (LinqLambdaExpression)this.ReplaceExpression(expression.Lambda);

                if (HasChanged(expression.Source, source) || HasChanged(expression.Lambda, lambda))
                {
                    return(linqBuilderCall(source, lambda, expression.ExpressionType));
                }

                return(expression);
            }

            if (this.HasChanged(expression.Source, source))
            {
                return(linqBuilderCall(source, null, expression.ExpressionType));
            }

            return(expression);
        }
示例#4
0
        private CodeExpression VisitQueryMethodWithLambdaExpression(LinqQueryMethodWithLambdaExpression expression, string methodName)
        {
            CodeExpression source = this.GenerateCode(expression.Source);

            if (expression.Lambda == null)
            {
                return(source.Call(methodName));
            }
            else
            {
                var lambda = this.GenerateCode(expression.Lambda) as CodeLambdaExpression;
                return(source.Call(methodName, lambda));
            }
        }
            private string VisitAnyOrAll(LinqQueryMethodWithLambdaExpression expression, string operatorName)
            {
                ExceptionUtilities.CheckArgumentNotNull(expression, "expression");
                string source = this.Convert(expression.Source);

                if (expression.Lambda == null)
                {
                    return(string.Format(CultureInfo.InvariantCulture, "{0}/{1}()", source, operatorName));
                }

                string lambda = this.Convert(expression.Lambda);

                return(string.Format(CultureInfo.InvariantCulture, "{0}/{1}({2})", source, operatorName, lambda));
            }
示例#6
0
        private QueryValue EvaluateQueryMethodWithLambdaExpression <TResult>(
            LinqQueryMethodWithLambdaExpression expression,
            Func <QueryCollectionValue, QueryValue> nolambdaEvaluator,
            Func <QueryCollectionValue, Func <QueryValue, TResult>, QueryValue> lambdaEvaluator)
            where TResult : QueryValue
        {
            var source = this.EvaluateCollection(expression.Source);

            LinqLambdaExpression lambda = expression.Lambda;

            if (lambda == null)
            {
                ExceptionUtilities.Assert(nolambdaEvaluator != null, "noLambdaEvaluator must not be null.");
                return(nolambdaEvaluator(source));
            }
            else
            {
                return(lambdaEvaluator(source, v => this.EvaluateLambda <TResult>(lambda, v)));
            }
        }