One of my favorite secrets about C# is that query syntax is actually a form of do notation. You can create your own interfaces that conform to the monad laws, and the compiler will happily let you apply query syntax to them the same way you can to IEnumerable.
That said, it's not something to actually make use of if you're trying to make your code readable, since the keywords are so tightly coupled to the LINQ use case.