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); }
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)); }
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 }); }