55 votes

LINQ - Syntaxe de requête vs chaînes de méthodes & lambda

Quelqu'un bâton à toutes les règles (ou vous êtes forcé de s'en tenir à toutes les règles par votre employeur?) lors du choix d'utiliser LINQ la syntaxe de la requête ou d'une expression Lambda à l'intérieur de l'un des LINQ méthodes d'extension? Cela s'applique à toutes les Entités, SQL, d'objets, de quoi que ce soit.

Sur notre lieu de travail, mon patron n'aime pas lambda, et il avait à utiliser la syntaxe de la requête pour rien, qui, dans certains cas, que je trouve sont de moins en moins lisible.

var names = collection.Select(item => item.Name);

var names = from item in collection
            select item.Name;

Peut-être que lors de l'ajout d'une condition, le Lambda je trouve est un peu en désordre, où l'

var names = collection.Where(item => item.Name == "Fred")
                      .Select(item => item.Name);

var names = from item in collection
            where item.Name == "Fred"
            select item.Name;

Vient de sortir d'intérêt: comment le compilateur de traiter celui-ci? Personne ne sait comment le au-dessus d'une requête LINQ de compiler en lambda? Sera l' Name bien être appelée pour chaque élément? Pourrions-nous faire de ce lieu et potentiellement améliorer la performance? Serait-ce à dire lambda est légèrement plus contrôlable en termes de performance?

var names = collection.Select(item => item.Name)
                      .Where(name => name == "Fred");

Certes, lorsque nous commençons à utiliser de plus en plus et les expressions, le lambda devient bordélique et j'aimerais commencer à utiliser la syntaxe de la requête ici.

var names = collection.Where(item => item.Name == "Fred")
                      .OrderBy(item => item.Age)
                      .Select(item => item.Name);

var names = from item in collection
            where item.Name == "Fred"
            order by item.Age
            select item.Name;

Il y a aussi quelques choses que je trouve ne peut être fait avec la syntaxe de la requête. Certains d'entre eux vous pourriez penser que ce serait vraiment simple (en particulier les fonctions d'agrégation), mais non, vous devez ajouter l'un de l'extension LINQ méthodes pour la fin, qui l'omi, de l'apparence plus soignée avec une expression lambda.

var names = collection.Count(item => item.Name == "Fred");

var names = (from item in collection
            where item.Name == "Fred"
            select item).Count()

Même pour certains le simple lambda chaînes, ReSharper est suggère que je les convertir en LINQ des requêtes sur.

Quelqu'un peut-il autre chose à ajouter à cela? Quelqu'un aurait-il de leur propre peu de règles ou ne leur entreprise suggèrent/forcer l'utilisation d'une seule?

36voto

Jon Skeet Points 692016

Pour répondre à votre question au sujet de la traduction, l'expression de la requête sera toujours traduite sur la base des règles sur 7.16 du C# 4 spec (ou l'équivalent en C# 3 spec). Dans l'exemple où vous êtes à poser la question de l' Name de la propriété, ce n'est pas une question de l'expression de la requête de la traduction - c'est ce que l' Select et Where méthodes de faire avec les délégués ou des arbres d'expression qu'ils prennent en tant que paramètres. Parfois, il est logique de faire une projection en avant de la filtrer, parfois pas.

Comme pour le peu de règles, je n'ai qu'une: l'utilisation de n'importe quelle façon est la plus lisible pour la requête en question. Donc, si la requête changements et "dont la forme est plus lisible" des modifications en même temps, changer la syntaxe utilisée.

Si vous allez utiliser LINQ, vous devriez être heureux avec soit la syntaxe, à tout le moins à lire.

J'ai tendance à trouver que les requêtes avec plusieurs variable de portée (par ex. via l' SelectMany ou Join, ou un let clause) finissent par être plus lisible en utilisant les expressions de requête - mais c'est loin d'être une règle dure et rapide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X