ok, here's the reason this doesn't auto-add a type filter.
It doesn't check whether the fields are from 1 single entity in a custom projection, it simply checks whether the fields are from subtypes and it then makes sure the subtypes are reachable in the SQL. It does add type filters when fetching a normal entity query because it then knows it's for that entity type.
The reason this isn't done automatically is that when 1 or more fields in the projection are from another entity, a type filter makes the returned set also wrong. Say you have a projection with 2 fields from Clerk and 3 from Manager. These two types are siblings, both are subtypes of Employee. If I add auto-type filters, the query will never result in a row, as the data can't be in both tables at the same time, as the types are siblings. So the type filters are not added automatically, but are explicit.
The query you supplied, might look like an entity fetch, but that's artificial: for the runtime it's a custom projection, the same as when you'd add 3 fields from the subtype to a new anonymous type.
There is room for some improvement here: it could verify whether all fields in the projection are from a single entity type. If so, and that type is a subtype, an entity filter should be added. The question now is: will that break applications or not. For some it might, for others it might not. I can't add this to the current codebase, even though it might look like a simple adjustment.
We'll postpone this addition to v4 and only add it if we have studied the impact enough. When doing projections on inheritance types, a type filter therefore is recommended. (Cast<T> will do, so:
from t in SalesOrderHistory.Cast<SalesOrderHistoryEntity>()
select new {t}
fixes it. Again, this looks redundant, but for the runtime it has little choice at the moment than to not append the type filter.