Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

A quoi correspond le mot clé let d’une expression Linq ?

Depuis .net 3.5, il est possible d’écrire des expressions Linq. Une expression Linq correspond à une expression utilisant les mots clé from, where, select, etc.

Le bout de code ci-dessous est une expression Linq.

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
 
var lowNums =
    from num in numbers
    where num < 5
    select num + 1;

Une expression Linq n’est qu’un sucre syntaxique : après compilation il n’y a plus de trace de ces expressions, elles sont transformés1 en code C# “classique”. Le code ci-dessus est donc strictement équivalent au code ci-dessous :

var lowNums = numbers
                .Where(num => num < 5)
                .Select(num => num + 1); 

Pour en savoir plus sur Linq : Linq (Language Integrated Query) [MSDN]

Personnellement, je n’aime pas la syntaxe Linq. Je trouve que cette syntaxe est limitée, dès que l’on a besoin de faire des choses un peu complexe, on retourne sur une syntaxe “classique”. 

Récemment, je me suis retrouvé en face d’une expression linq contenant le mot clé let. Ce mot clé permet de stocker temporairement le résultat d’une sous-expression.

Par exemple :

String sentence =  "A penny saved is a penny earned.";
 
// Split the sentence into an array of words and select those whose first letter is a vowel.
var earlyBirdQuery =
    from word in sentence.Split(' ')
    let w = word.ToLower()
    where w[0] == 'a' || w[0] == 'e' || w[0] == 'i' || w[0] == 'o' || w[0] == 'u'
    select word;

Le code ci-dessus permet d’extraire tous les mots commençant par une voyelle d’une phrase. Le mot clé let permet ici de stocker le mot converti en minuscule.

Je me suis donc demandé comment était traduit ce mot clé. Si l’on regarde le code généré avec ILSpy on obtient le code suivant :

var earlyBirdQuery = 
    sentence.Split(' ')
            .Select(word => new { Word = word, loweredWord = word.ToLower() })
            .Where(o => o.loweredWord[0] == 'a' || o.loweredWord[0] == 'e' || o.loweredWord[0] == 'i' || o.loweredWord[0] == 'o' || o.loweredWord[0] == 'u')
            .Select(o => o.Word); 

Le mot clé let est donc traduit par une projection avec la création d’un type anonyme, il n’y a donc rien de magique.

Et vous, utilisez-vous les horribles mots clé Linq ?


1 : C’est, en fait un peu plus complexe car le code C# “classique” utilise les méthodes d’extension qui sont eux aussi un sucre syntaxique. De plus, si l’expression Linq se fait sur un IQueryable, alors C# va générer le code permettant d’avoir une instance d’une Expression.
Posted: dimanche 6 novembre 2011 16:41 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Matthieu MEZIL a dit :

Mais carrément, c'est tellement cool LINQ ! :)

J'ai souvent tendance à utiliser les extensions méthodes cependant et on me le reproche souvent alors que l'écriture LINQ est beaucoup plus lisible

# novembre 6, 2011 17:41

Graveen a dit :

mode requete beaucoup plus lisible, donc plus facilement maintenables.

je connais et j'utilise un peu le mode expression, mais dès que la complexité s'envole, je mets moins de temps à retoucher mes selections en mode query.

# novembre 6, 2011 20:30

cyril a dit :

Du coup, dès que vous voulez jouer avec des top, first et max, vous rajoutez de parenthèse ? idem pour le .Any / .All ?

idem si vous voulez créer vos propres méthodes d'extensions ?

Vraiment, je trouve que cette syntaxe limite notre champ d'action :-)

# novembre 6, 2011 20:53

Graveen a dit :

Oui, je rajoute des parenthéses. Mais ca ne me dérange pas plus que ça, et au contraire ça isole bien la requête du choix du nombre de données.

Aprés, je pense sérieusement que LINQ est formidable mais bordelifère, et mon code est précisement travaillé dans le sens de la clarté. Concrètement, pas de requêtes chargées, mais 2,3 ou 4. De mémoire, je n'ai pas souvenir d'avoir senti une limitation en plusieurs années de pratiques :)

# novembre 6, 2011 21:39

Matthieu MEZIL a dit :

Par contre LINQ c'est C#3 ou .NET 3.5 mais pas .NET 3...

# novembre 7, 2011 09:16

Matthieu MEZIL a dit :

@Graveen: Là où je rejoins Cyril, c'est sur le fait qu'il manque beaucoup d'opérateur ce qui fait qu'on est obligé de mixer entre syntaxe LINQ et extension méthode de LINQ. En utilisant que les extension methods, on perd souvent en lisibilité mais on gagne à l'inverse en homogénéité

# novembre 7, 2011 09:20

grogru a dit :

Je préfère utiliser la syntaxe Linq plutôt que la syntaxe query de 90% des cas. Un seul truc me dérange avec la syntaxe Linq, ce sont les jointures qui deviennent vite compliqués à lire.

# novembre 7, 2011 10:10
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- « Naviguer vers le haut » dans une librairie SharePoint par Blog de Jérémy Jeanson le 10-07-2014, 13:21

- PowerShell: Comment mixer NAGIOS et PowerShell pour le monitoring applicatif par Blog Technique de Romelard Fabrice le 10-07-2014, 11:43

- ReBUILD 2014 : les présentations par Le blog de Patrick [MVP Office 365] le 10-06-2014, 09:15

- II6 Management Compatibility présente dans Windows Server Technical Preview avec IIS8 par Blog de Jérémy Jeanson le 10-05-2014, 17:37

- Soft Restart sur Windows Server Technical Preview par Blog de Jérémy Jeanson le 10-03-2014, 19:43

- Non, le certificat public du CA n’est pas un certificat client !!! par Blog de Jérémy Jeanson le 10-03-2014, 00:08

- Windows Server Technical Preview disponible via MSDN par Blog de Jérémy Jeanson le 10-02-2014, 19:05

- Focus Sauvegardes SharePoint par Le blog de Patrick [MVP Office 365] le 10-02-2014, 13:11

- Technofolies, votre évènement numérique de l'année par Le Blog (Vert) d'Arnaud JUND le 09-26-2014, 18:40

- Xamarin : From Zero to Hero par Fathi Bellahcene le 09-24-2014, 17:35