I really like the 3 + 1 tier way of doing things.
One tier for UI, one for business logic, and for persisting data. The last one you say? Domain objects and interfaces.This makes it possible to load up any one or two of the main tiers plus the domain "tier", and the code should work.
It relies heavily on dependency injection and Inversion of Control principles.
The data/persistence tier does only two things. It Creates,Reads,Updates and Deletes data, and maps it to the domain object format.
The UI tier does the exact opposite. It displays and receives data in a way that the user can relate to, and maps that output/input to and from the domain object format.
The business logic tier just need to know one thing. Business logic. It does not care about where the data is from, and it does not care about where the data tier is putting it. It knows that it should flag an account that was just overdrawn, how to physically do that is not part of its job really.
The domain objects themselves does not have any logic, they are just containers for passing data between the tiers. This means that you can load the domain objects and interfaces without having to think at all about dependencies.
In the end of the day I feel that I have a pretty clear code base with clearly separated tiers. And with some strict interfaces and good base classes most of the coding is just telling the software what to do then X happens. Just how it is supposed to be.
</rant>
Edit:
Oh, yeah. This is true for both the linq and SubSonic/Other ORMs.