Skipping the details, heres the code binding to a linq query:
users.LinqContext = new UserDataContext();
users.ItemsSource = from i
in users.DataSource<User>()
select i;
And this code fully supports inserts/updates/deletes.
The implementation lives inside the DataSource<User>() call. This devious character returns a reference to a IBindingList (which supports the table modifications) and implements IQueryable (to support linq queries).
What about inheritance?
Imagine you had a sub class called SuperUser; if you've played with linq inheritance you'll know that you have to use the base type User to actually do anything. It's kind of a pain, and you get real friendly with the .OfType<>() call.
So here's the code again, this time selecting all SuperUsers.
users.ItemsSource = from i
in users.DataSource<User, SuperUser>()
select i;
Can I use .Take(x)?
As far as I can tell, all the standard linq statements are supported (including aggregate operators). I haven't looked into partial classes and anonymous types, though I doubt they'd work well.
I won't go into the laborious details of how it's all implemented, just know that it's been fun playing with linq expression trees and writing my own IQueryProvider.
If you are interested, the code can be found here.
I haven't seen anything quite like this out there, so if you have some opinions - I'd love to hear some feedback.