2009-06-08 4 views
17

A quoi ressemblerait la requête suivante si j'utilisais la syntaxe de la méthode d'extension?GroupBy avec la syntaxe de la méthode linq (pas la syntaxe de la requête)

var query = from c in checks 
group c by string.Format("{0} - {1}", c.CustomerId, c.CustomerName) 
into customerGroups 
select new { Customer = customerGroups.Key, Payments = customerGroups } 
+0

Pour votre future référence, cette question est répondue dans la spécification C# 3.0, que vous pouvez télécharger sur Internet. Toutes les règles de transformation de requête sont spécifiées ici. –

+0

ty, ne savait pas que les règles de transformation étaient documentées. –

Répondre

22

Il ressemblerait à ceci:

var query = checks 
    .GroupBy(c => string.Format("{0} - {1}", c.CustomerId, c.CustomerName)) 
    .Select (g => new { Customer = g.Key, Payments = g }); 
3

Depuis le compilateur fait cette traduction pour vous, lancez Reflector et jeter un coup d'oeil.

8

D'abord, la réponse de base:

var query = checks.GroupBy<Customer, string>(delegate (Customer c) { 
    return string.Format("{0} - {1}", c.CustomerId, c.CustomerName); 
}).Select(delegate (IGrouping<string, Customer> customerGroups) { 
    return new { Customer = customerGroups.Key, Payments = customerGroups }; 
}); 

Alors, comment voulez-vous comprendre ces choses vous-même?

D'abord, téléchargez Reflector depuis here et installez-le. Ensuite, construisez un exemple de programme, comme un petit programme de console, contenant le code que vous voulez analyser. Voici le code que j'ai écrit:

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApplication11 
{ 
    public class Customer 
    { 
     public Int32 CustomerId; 
     public Int32 CustomerName; 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var checks = new List<Customer>(); 
      var query = from c in checks 
         group c by String.Format("{0} - {1}", c.CustomerId, c.CustomerName) 
          into customerGroups 
          select new { Customer = customerGroups.Key, Payments = customerGroups }; 
     } 
    } 
} 

Alors vous construisez que, et le réflecteur ouvert, et lui demander d'ouvrir le fichier .exe en question.

Ensuite, vous accédez à la méthode en question, qui dans mon cas était ConsoleApplication11.Program.Main.

L'astuce ici est d'aller à la page d'options de Reflector, et de lui demander d'afficher la syntaxe C# 2.0, qui remplacera Linq par les appels de méthodes statiques appropriés. En faisant cela me donne le code suivant:

private static void Main(string[] args) 
{ 
    List<Customer> checks = new List<Customer>(); 
    var query = checks.GroupBy<Customer, string>(delegate (Customer c) { 
     return string.Format("{0} - {1}", c.CustomerId, c.CustomerName); 
    }).Select(delegate (IGrouping<string, Customer> customerGroups) { 
     return new { Customer = customerGroups.Key, Payments = customerGroups }; 
    }); 
} 

Maintenant, bien sûr, ce code peut être écrit un peu plus jolie avec lambdas et similaire, comme ce @mquandershowed, mais avec réflecteur, au moins, vous devriez être en mesure de comprendre la les appels de méthode sont impliqués.

+0

ReSharper a également une conversion vers/depuis la syntaxe de requête. – bzlm

1

Je sais que c'est une vieille question, mais pour les nouveaux lecteurs, jetez un oeil au code this gitub.

Ceci utilise Roslyn pour prendre la syntaxe de requête et la convertir en syntaxe de méthode d'extension.

Questions connexes