ah! I see what you mean.
The Enumerator traverses the set and returns a list, which is a copy action, and the Execute method avoids that (it returns the set produced by the query without copying it).
You can avoid this by simply enumerating the 'q', which makes you enumerate the real result list, and do the action you want to perform per element. This might not doable in your situation, e.g. you might want to add additional linq to objects operators to the resultset. This indeed has the side effect that the linq provider fetches the data into a list, and you then again copy it in a list through the operations applied to it in memory.
Though you can always cast the 'q' (unless it's a scalar value, because Linq doesn't defer the execution of these queries, they're executed immedately) to ILLBLGenProQuery and call Execute. You don't know the type to pass to the generic method, but there's a non-generic method as well. You can cast that result to IList for example, if you don't want to have the copy action.
Other than that, you either have to write a custom class per query or use strictly enumeration over the queries (so foreach(var v in q) {} )