Пример #1
0
            public QueryablePipeline From(string variable, Expression source)
            {
                var elementType = GetElementType(source.Type);


                var result = new QueryablePipeline
                {
                    Variable      = variable,
                    QueryableExpr = source,
                    Parameter     = Expression.Parameter(elementType, variable)
                };

                // TODO: Unversal search for extension method container
                if (typeof(IQueryable <>).MakeGenericType(elementType).IsAssignableFrom(source.Type))
                {
                    result.MethodContainerType = typeof(Queryable);
                }
                else if (typeof(IEnumerable <>).MakeGenericType(elementType).IsAssignableFrom(source.Type))
                {
                    result.MethodContainerType = typeof(Enumerable);
                }
                else
                {
                    throw new InvalidOperationException(
                              "Unable to find extension method container for type '" + source.Type.FullName + "'");
                }

                scope[variable] = result.Parameter;
                return(result);
            }
Пример #2
0
            public Expression FromSelect(QueryablePipeline pipeline, Expression expression)
            {
                var inElementType        = pipeline.ElementType;
                var outElementType       = expression.Type;
                var selectorDelegateType = typeof(Func <,>).MakeGenericType(inElementType, outElementType);

                var selectorExpr = Expression.Lambda(
                    selectorDelegateType,
                    expression,
                    pipeline.Parameter);

                return
                    (Expression.Call(
                         pipeline.MethodContainerType,
                         "Select",
                         new Type[]
                {
                    inElementType,
                    outElementType
                },
                         pipeline.QueryableExpr,
                         selectorExpr));
            }
Пример #3
0
            public QueryablePipeline Where(QueryablePipeline pipeline, Expression condExpr)
            {
                var predicateType = typeof(Func <,>).MakeGenericType(pipeline.ElementType, typeof(bool));

                var predicate = Expression.Lambda(
                    predicateType,
                    condExpr,
                    pipeline.Parameter);

                return(new QueryablePipeline
                {
                    QueryableExpr =
                        Expression.Call(
                            pipeline.MethodContainerType,
                            "Where",
                            new Type[] { pipeline.ElementType },
                            pipeline.QueryableExpr,
                            predicate),
                    Variable = pipeline.Variable,
                    Parameter = pipeline.Parameter,
                    MethodContainerType = pipeline.MethodContainerType
                });
            }