2009-06-08 2 views
17

Wie würde die folgende Abfrage aussehen, wenn ich die Syntax der Erweiterungsmethode verwendete?GroupBy mit Linq-Methodensyntax (nicht Abfragesyntax)

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

Für Ihre Zukunft, diese Frage wird in der C# 3.0-Spezifikation beantwortet, die Sie weg von dem Internet herunterladen können. Alle Abfragetransformationsregeln sind dort angegeben. –

+0

ty, wusste nicht, dass die Transformationsregeln dokumentiert wurden. –

Antwort

22

Es würde wie folgt aussehen:

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

Da der Compiler diese Übersetzung für Sie tut, Feuer Reflector und einen Blick darauf werfen.

8

Zunächst wird die grundlegende Antwort:

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 }; 
}); 

Dann, wie kommst du darauf, diese Dinge aus sich selbst?

Zuerst Reflektor von here herunterladen und installieren.

Erstellen Sie dann ein Beispielprogramm, wie ein kleines Konsolenprogramm, das den Code enthält, den Sie analysieren möchten. Hier ist der Code, den ich schrieb:

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 }; 
     } 
    } 
} 

Dann bauen Sie das, und offene Reflektor, und fordert diese auf die EXE-Datei in Frage zu öffnen.

Dann navigieren Sie zu der betreffenden Methode, die in meinem Fall ConsoleApplication11.Program.Main war.

Der Trick hier ist, auf die Optionen-Seite von Reflector zu gehen, und es zu fragen, C# 2.0-Syntax zu zeigen, die Linq mit den entsprechenden statischen Methodenaufrufen ersetzen wird. das zu tun gibt mir den folgenden Code:

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 }; 
    }); 
} 

Nun, natürlich, diesen Code kann ein bisschen hübscher mit Lambda und ähnlich geschrieben werden, wie das, was @mquandershowed, aber mit Reflektor, zumindest sollten Sie in der Lage sein, das zu verstehen, Methodenaufrufe beteiligt sein.

+0

ReSharper hat auch eine Konvertierung in die/aus der Abfragesyntax. – bzlm

1

Ich weiß, das ist eine alte Frage, aber für neue Leser, werfen Sie einen Blick auf this gitub Code.

Verwenden Sie Roslyn, um die Abfragesyntax zu übernehmen und in die Syntax der Erweiterungsmethode zu konvertieren.