public static Expression AsConstantExpression(this object value, bool parameterised = false) { if (!parameterised) { return(Expression.Constant(value)); } var valueType = value.GetType(); var makeTuple = ExpressionEx.Converter(typeof(object), v => typeof(Expression).Call("Constant", new Type[] { }, typeof(Tuple).Call("Create", new[] { valueType }, v.CastAs(valueType))) ) .Compile() .AsConstantExpression(); var makeConstantExpression = ExpressionEx.Converter(typeof(object), v => typeof(Expression).Call("Property", new Type[] { }, Expression.Invoke(makeTuple, v), "Item1".AsConstantExpression()) ) .Compile(); var res = ((Func <object, MemberExpression>)makeConstantExpression)(value); return((Expression)res); }
public static IQueryable SelectMany(this IQueryable items, Func <ParameterExpression, Expression> projection) { var projectionLambda = ExpressionEx.Converter(items.ElementType, projection); var queryableCallExpression = items.CallQueryable("SelectMany", new[] { items.ElementType, projectionLambda.ReturnType.GetEnumerableItemType() }, projectionLambda); var projectedQuery = items.Transform(queryableCallExpression); return(projectedQuery); }