Co-Worker: Lets be honest here. Linq syntax sucks. It's confusing and non-intuitive.
Non puoi litigare con quella critica. Per il tuo collega, fa schifo . Non siamo riusciti a progettare una sintassi che, per loro, fosse chiara e intuitiva. Questo è il nostro fallimento, e puoi passare le mie scuse al tuo collega. Sono felice di dare suggerimenti su come migliorarlo; che cosa rileva in modo particolare il tuo collega confuso o non intuitivo?
Tuttavia, non puoi accontentare tutti. La mia opinione personale, e l'opinione della maggior parte delle persone con cui ho parlato sull'argomento, è che la sintassi della comprensione delle query è molto più chiara della sintassi imperativa equivalente. Chiaramente non tutti sono d'accordo, ma fortunatamente non richiediamo il consenso di tutti i milioni di nostri clienti quando progettiamo la lingua.
A proposito di ciò che è "intuitivo", però, mi viene in mente la storia del linguista inglese che ha studiato molte lingue diverse e alla fine ha concluso che l'inglese era la migliore di tutte le lingue perché in inglese, le parole arrivano nello stesso ordine in cui li pensi . A differenza del francese, dove dicono continuamente cose come "il cane bianco mangia la carne rossa". Quanto deve essere difficile per i francesi pensare le parole nell'ordine correggere e poi dover dirle nel francese ordine! Il francese è così poco intuitivo! È incredibile che i francesi riescano a parlarne. E tedesco? dove pensano "il cane mangia la carne" ma poi devono dire "il cane mangia la carne"!?! Quindi non intuitivo.
Spesso ciò che è "intuitivo" è semplicemente una questione di familiarità. Mi ci sono voluti mesi di lavorare con LINQ prima di interrompere le mie query con la clausola "select". Ora è una seconda natura e l'ordine SQL sembra bizzarro.
Quale è! Le regole di scoping sono tutte incasinate in SQL. Qualcosa che potresti voler segnalare al tuo collega è che LINQ è stato attentamente progettato in modo che (1) l'introduzione di variabili e ambiti avvenga da sinistra a destra (*), e (2) l'ordine in cui la query appare sulla pagina sia l'ordine in cui viene eseguito. Cioè, quando dici
from c in customers where c.City == "London" select c.Name
la c appare nello scope a sinistra e rimane nel campo di applicazione a destra. E l'ordine in cui le cose accadono sono: prima vengono valutati i "clienti". Quindi il "dove" viene valutato per filtrare la sequenza. Quindi la sequenza filtrata viene proiettata dalla "selezione".
SQL non ha questa proprietà. Se dici
SELECT Name FROM Customers WHERE City = 'London'
quindi "Nome" viene messo in campo da qualcosa alla sua destra, non alla sua sinistra, e la query viene eseguita in un ordine completamente incasinato; la clausola centrale viene valutata per prima, quindi l'ultima clausola e quindi la prima clausola. Ora mi sembra pazzesco e non intuitivo, avendo lavorato esclusivamente con LINQ per così tanto tempo.
(*) Le regole di selezione sono un po 'strane in LINQ con le clausole di join. Ma a parte questo, gli ambiti si annidano bene.