Hi David,
In his presentation, he didn't show the LINQ code that produced that blob of SQL. But it's an extreme example anyway. The point is that abstraction layers have to be general-purpose, so in any situation besides the utterly trivial
SELECT * FROM Table, ORM's can't optimize for a given situation as well as a human can.
That's why I say that ORMs are generally for developer productivity, not code efficiency. It could still be a win if 80% of your code uses the
SELECT * FROM Table type of query, but
you should assume that you'll need to bypass the ORM for your remaining queries. If we were to accept that, the ORM could be smaller and simpler, and it wouldn't be as likely to make a mess out of the simple queries, as in the LINQ example above.