I finally found the solution in a wonderful enhancement of Microsoft's Dynamic LINQ sample. Krzysztof Olczyk has worked some magic to add several handy features to Dynamic.cs, one of which allows the casting of query results back to a known type. So with his version of Dynamic.cs, you can do this:
IQueryable<MyType> Results = MyResults.Select<MyType>("new @out (Prop1, Prop2)");This is great because it bridges the gap between the performance and flexibility of Dynamic LINQ and the type-safety of standard LINQ, and you get the best of both worlds!
UPDATE: The relevant code for the Select<T> function is below, but I highly recommend you check out the other enhancements he as added as well.
private static IQueryable Select(Type type, IQueryable source, string selector, object[] values) { if (source == null) throw new ArgumentNullException("source"); if (selector == null) throw new ArgumentNullException("selector"); LambdaExpression lambda = DynamicExpression.ParseLambda(source.ElementType, type, selector, values); return source.Provider.CreateQuery( Expression.Call( typeof(Queryable), "Select", new Type[] { source.ElementType, lambda.Body.Type }, source.Expression, Expression.Quote(lambda))); } public static IQueryable Select(this IQueryable source, string selector, params object[] values) { return Select(null, source, selector, values); } public static IQueryable<T> Select<T>(this IQueryable source, string selector, params object[] values) { return Select(typeof(T), source, selector, values) as IQueryable<T>; }