>> sqlStmt += " CITY = '" + txtCity.Text + "' "; // London ; )
I really hope you are protecting your database more than this in reality and this was just for the simplicity of the example. A user could do SQL injection if they wanted very easily. While it's more popular to do SQL injection in web apps, it can happen in Win apps as well.
The LINQ stuff is really great, the comments about performing joins across multiple sources is intriguing. I could select email from outlook, have it join where the from address matches values in ActiveDirectory for a specific group... so you could pull out all emails from administrators, for a simple example.
The danger I see, however, is that it could be very easily abused and not completely understood so that some very slow queries would be written.
In the above example, I'd imagine that since the two pieces of results are coming from different sources (one from AD and one from your email source) that each would be returned and joined in memory. That means that I may have 1000 emails and only one of them is from an admin but all 1000 emails are returned before the joining can occur. The compiler wouldn't know that the list of admins is small enough to execute it first and pass it in as a param to the email engine so that it would only return that one email.
When first watching, I had the thought "ok, now so many things are so much simpler that it allows amateurs to do what normally required a professional" maybe now the differentiator will be that I will understand enough of how it is all working that my code will designed to run significantly faster.
It's all great stuff. I love that through the type inferencing and dynamically generated classes, it has the ease of non-typed languages (Ruby) without losing the performance and benefits of strong typing.