I totally agree. Sure there where similar things a in the funcional world before, but LinQ had some important pros:
- deferred ejecution by default, saving memory and time
- step by step syntax, each new operation is at the end, not the beginning
- excellent type inference and intellisense, js? ruby?...
- it works with the same syntax on the database!!! Haskell?
- map and filter where there, but groupby and join where not so common in previous query comprehensions APIs.
- the most important: it's actually usable in jobs you get paid for, not experiments you can make at home or university.
There are however two things that doesnt make it 100% perfect:
- expression tree lambas are identical to non expression ones, making it hard for developers to know if one step is going to be translated or executed. I would have chosen => for non expression and -> for expressions for example or something like that.
- having two syntax, method chain and query comprehensions, produces a frequent anoying back and forth since some operators are better written in one (let, join, group by) while others are only available in method chain (take, toDictionary...)
- deferred ejecution by default, saving memory and time
- step by step syntax, each new operation is at the end, not the beginning
- excellent type inference and intellisense, js? ruby?...
- it works with the same syntax on the database!!! Haskell?
- map and filter where there, but groupby and join where not so common in previous query comprehensions APIs.
- the most important: it's actually usable in jobs you get paid for, not experiments you can make at home or university.
There are however two things that doesnt make it 100% perfect:
- expression tree lambas are identical to non expression ones, making it hard for developers to know if one step is going to be translated or executed. I would have chosen => for non expression and -> for expressions for example or something like that.
- having two syntax, method chain and query comprehensions, produces a frequent anoying back and forth since some operators are better written in one (let, join, group by) while others are only available in method chain (take, toDictionary...)