65 votes

Méthodes d'extension syntaxe vs syntaxe de requête

Je suis en train d'essayer d'obtenir une poignée sur si il y a un bon moment pour utiliser les mots clés linq ou d'extension linq méthodes avec les expressions lambda. Ils ont l'air de faire la même chose, mais s'écrivent différemment. Est-ce uniquement une question de style?

var query = from p in Products
    where p.Name.Contains("foo")
    orderby c.Name
    select p;

// or with extension methods:
var query = Products
    .Where(p => p.Name.Contains("foo")
    .OrderBy(p => p.Name);

Ils sont très similaires avec le deuxième exemple d'être un peu plus laconique, mais peut-être moins expressif si vous ne savez pas ce que l' => est en train de faire.

D'autres que l'écriture laconique code, existe-il d'autres avantages à utiliser les méthodes d'extension, par opposition à la syntaxe LINQ?

33voto

Programmin Tool Points 2937

Honnêtement, parfois, il peut être de la situation une fois que vous commencez à utiliser Funcs et des Actions. Dites que vous êtes à l'aide de ces trois funcs:

  Func<DataClasses.User, String> userName = user => user.UserName;
  Func<DataClasses.User, Boolean> userIDOverTen = user => user.UserID < 10;
  Func<DataClasses.User, Boolean> userIDUnderTen = user => user.UserID > 10;

Comme vous pouvez le voir le premier remplace le lamdba expression pour obtenir le nom d'utilisateur, le second remplace un lamdba expression utilisée pour vérifier si l'ID est inférieur à 10, et avouons-le, la troisième devrait être assez facile à comprendre maintenant.

NOTE: Ceci est un exemple stupide, mais il fonctionne.

  var userList = 
    from user in userList
    where userIDOverTen(user)
    select userName;

Rapport

  var otherList =
    userList
    .Where(IDIsBelowNumber)
    .Select(userName)

Dans cet exemple, le deuxième est un peu moins verbeux depuis la méthode d'extension permet l'utilisation de la touche Func, mais il Linq expression ne peut pas car il est pour un Booléen plutôt que d'une Fonction qui retourne un booléen. Cependant, c'est là où il pourrait être préférable d'utiliser l'expression de la langue. Dire que vous avez déjà eu une méthode qui prend plus que juste un utilisateur:

  private Boolean IDIsBelowNumber(DataClasses.User user, 
          Int32 someNumber, Boolean doSomething)
  {
    return user.UserID < someNumber;
  }

Remarque: doSomething est juste là, à cause de la méthode d'extension d'être ok avec une méthode qui prend un utilisateur et un entier et retourne un booléen. Type de gênant pour cet exemple.

Maintenant, si vous regardez la requête Linq:

  var completeList =
     from user in userList
     where IDIsBelowNumber(user, 10, true)
     select userName;

Vous êtes bon pour elle. Maintenant, la Méthode d'Extension:

  var otherList =
    userList
    .Where(IDIsBelowNumber????)
    .Select(userName)

Sans une expression lambda, j'ai vraiment ne peut pas appeler cette méthode. Alors maintenant, ce que j'ai à faire est de créer une méthode qui crée un Func basé sur l'original de l'appel de méthode.

   private Func<DataClasses.User, Boolean> IDIsBelowNumberFunc(Int32 number)
   {
      return user => IDIsBelowNumber(user, number, true);
   }

Et puis branchez-le à:

  var otherList =
     userList
     .Where(IDIsBelowNumberFunc(10))
     .Select(userName)

Donc vous pouvez voir que, parfois, il peut être plus facile d'utiliser la requête approche à la fois.

24voto

Nathan W Points 19990

L'avantage d'utiliser les méthodes d'extension, c'est que vous pouvez définir votre propre et il continue à lire fine, où que parce que votre nouvelle méthode d'extension n'est pas dans la liste des mots-clés, il va chercher un peu étrange mélangé avec d'autres mots-clés.

Exemple, je suis en utilisant une extension personnalisée appelé dans lequel prend juste une chaîne de caractères:

var query = (from p in Products
    where p.Name.Contains("foo")
    orderby c.Name
    select p).Into("MyTable");

vs

var query = Products
                   .Where(p => p.Name.Contains("foo")
                   .OrderBy(p => p.Name)
                   .Into("MyTable");

Je me sens le, plus tard, se lit mieux lorsque vous avez personnalisé extenstion méthodes que vous devez utiliser.

14voto

Rodi Points 187

Je pense que c'est une bonne idée de ne pas les utiliser ensemble et en choisir une et de s'y tenir.

Surtout que c'est le goût personnel, mais dans la syntaxe de la requête (Compréhension de la méthode) pas tous les opérateurs sont disponibles comme cela a été dit avant.

- Je trouver les Méthodes d'Extension de la syntaxe plus en ligne avec le reste de mon code. Je fais de mon SQL dans SQL. Il est également très facile de construire votre expression tout en ajoutant tout sur eachother avec les méthodes d'extension.

Juste mes deux cents.

Comme je ne peux pas faire de commentaires pour l'instant je veux faire un ici à la réponse de l'Outil de Programmation: Pourquoi en faire une toute nouvelle méthode pour le dernier exemple?? Ne pouvez-vous pas simplement utiliser:

.Where(user => IDIsBelowNumber(user, 10, true))

6voto

Mark Brackett Points 46824

Ils compilent le même, et sont équivalents. Personnellement, je préfère les méthodes lambda (extension) pour la plupart des choses, en n'utilisant que les instructions (standard) si je fais LINQ to SQL ou que j'essaie d'imiter SQL. Je trouve que les méthodes lambda sont plus fluides avec le code, alors que les énoncés sont distrayants visuellement.

4voto

Eric Minkes Points 1051

Je préfère la syntaxe de méthode d'extension lorsque j'utilise des méthodes Linq qui n'ont pas d'équivalent de requête, tel que FirstOrDefault () ou d'autres méthodes similaires.

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