59 votes

LINQ: Notation par points vs Expression de Requête

Je suis au début de l'utilisation de LINQ en général (jusqu'à présent toXML et toSQL). J'ai vu qu'il y a parfois deux ou plusieurs façons d'obtenir les mêmes résultats. Prenez cet exemple simple, comme je le comprends à la fois le retour à exactement la même chose:

SomeDataContext dc = new SomeDataContext();

var queue = from q in dc.SomeTable
        where q.SomeDate <= DateTime.Now && q.Locked != true
        orderby (q.Priority, q.TimeCreated)
        select q;

var queue2 = dc.SomeTable
        .Where( q => q.SomeDate <= DateTime.Now && q.Locked != true )
        .OrderBy(q => q.Priority)
        .ThenBy(q => q.TimeCreated);

D'ailleurs une erreur que j'ai peut être fait dans la syntaxe ou la disparition d'un paramètre ou d'une différence, l'idée est qu'il y a deux façons d'exprimer la même chose; je comprends que la première méthode présente certaines limites et que le "point" est le plus complet, mais en plus de cela, existe-il d'autres avantages?

57voto

andleer Points 12090

Le "point" de la notation est généralement appelé Lambda de la syntaxe. La première notation passe par un certain nombre de noms, mais j'ai l'habitude de l'appeler la syntaxe de la requête.

Je travaille sur une équipe de 10 développeurs et nous soutenons à la longueur sur laquelle nous devrions nous utiliser comme un standard. En général, les plus aguerris (avec LINQ) les développeurs à migrer vers le Lambda de la syntaxe, mais il y a d'importantes exceptions.

Lambda est plus concis, mais la réalisation de plusieurs jointures de table est un cauchemar. Les jointures sont tout simplement beaucoup plus propre avec la syntaxe de la requête. Le revers de la médaille est qu'il y a un certain nombre de LINQ opérations qui n'existent que dans le Lambda syntaxe: Unique(), First(), Count (), etc.

Donc, utilisez ce que vous sentez le plus à l'aise et se rendre compte que, comme vous acquérir de l'expérience, votre préférence va probablement changer. Il est très utile de pouvoir les lire tous les deux et il y aura certainement des situations où vous devez utiliser un peu des deux. D'autres situations se prêtent eux-mêmes à un style au-dessus des autres. En fin de compte, tout cela se traduit dans le même code exécutable.

29voto

Jon Skeet Points 692016

J'utilise celui de la syntaxe est plus lisible pour ma requête, au cas par cas.

Si possible, j'essaie d'éviter de mélanger et assortir les deux, même si parfois c'est bon (si c'est un simple appel à l' First() à la fin d'une requête, par exemple). Exécution différée signifie qu'il est tout aussi efficace pour utiliser une expression de requête et affecter le résultat à une variable, et ensuite utiliser la notation de point à l'aide de cette variable:

var query = from x in y
            orderby z
            group x by x.Name into groups
            // etc
            select foo;

var page = query.Skip(50).Take(10);

Comme d'autres l'ont dit, les expressions de requête sont juste traduit en "normal" C# 3 sans les expressions de requête, donc il n'y a aucune pénalité pour ce faire.

8voto

Razzie Points 14705

Eh bien, la dot notation peut être beaucoup plus courte. Prendre:

var result = from p in dc.Products
             where p.Id > 5
             select p;

ou:

var result = dc.Products.Where(p => p.Id > 5);

Je préfère celui-ci car il est beaucoup plus court et plus lisible.

3voto

Shaul Points 8267

Je trouve Lambda notation plus propres et plus concis. Je trouve juste que c'est gênant que si vous avez une expression Lambda de n'importe où à l'intérieur d'un appel de méthode, vous ne pouvez pas modifier le code à la volée en mode debug...

2voto

user76035 Points 1169

Ils compiler le même code, ou plutôt la première est d'abord traduit à la seconde, puis compilé.

Vous avez raison, la différence est que la première version est plus propre, mais plus limitée. Dans le deuxième, vous pouvez utiliser, par exemple, déjà existant délégués, par exemple:

Func<int, bool> isEven = i => i%2 == 0;
Enumerable.Range(10).Where(isEven).ToList().ForEach(Console.WriteLine);

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