Architecture of the software becomes simplified and more declarative using LINQ, and in many cases erases the notion of separate tiers, for a large range of software.
Building scalable n-tiers architectures with LINQ in many cases generates the n in the tier for you, by surfacing the abstraction that you’ve already had to do countless times.
Now we can declare that LINQ should go and do something, across tiers, etc…, and the machine handles that. PLINQ, “parallel LINQ” is for distributing LINQ processing across multi-cores and CPUs. This is a prime example of the way that LINQ will allow simplification of complicated designs and how it abstracts CPU architectures is applicable in many other possible implementations.
So we can approach the code that is n-tier, from 1-page of code, rather than having all kinds of disparate languages that all ultimately rely on passing strings around and lose all type information in transit.
That doesn’t mean we still don’t have n-tiers in many cases … after all services just keep growing and features get added that require integration with other systems and so on … and there’s always going to be layers of separation, but LINQ does what it’s advertised, it alleviates the “impedence mismatch” between the tiers where they do exist.