2009-06-08 3 views
17

Как выглядел бы следующий запрос, если бы я использовал синтаксис метода расширения?GroupBy с синтаксисом метода linq (не синтаксис запроса)

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

Для вашей будущей ссылки на этот вопрос отвечает спецификация C# 3.0, которую вы можете загрузить из Интернета. Здесь указаны все правила преобразования запросов. –

+0

ty, не знал, что правила трансформации были задокументированы. –

ответ

22

Это будет выглядеть следующим образом:

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

Поскольку компилятор делает этот перевод для вас, запустите Reflector и посмотрите.

8

Во-первых, основной ответ:

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

Тогда, как вы выясните эти вещи сами?

Сначала скачайте Reflector с here и установите его.

Затем создайте образец программы, как небольшую консольную программу, содержащую код, который вы хотите проанализировать. Вот код, который я написал:

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

Тогда вы строите, что и открытый отражатель, и попросить его, чтобы открыть файл с расширением .exe в вопросе.

Затем вы переходите к рассматриваемому методу, который в моем случае был ConsoleApplication11.Program.Main.

Хитрость здесь заключается в том, чтобы перейти на страницу параметров Reflector и попросить показать синтаксис C# 2.0, который заменит Linq соответствующими вызовами статических методов. Делать это дает мне следующий код:

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

Сейчас, конечно, этот код может быть написан немного симпатичнее с лямбды и похожи, как то, что @mquandershowed, но с отражателем, по крайней мере, вы должны быть в состоянии понять вызов метода.

+0

ReSharper также имеет преобразование в/из синтаксиса запроса. – bzlm

1

Я знаю, что это старый вопрос, но для новых читателей ознакомьтесь с кодом this gitub.

Это использование Roslyn для синтаксиса запроса и преобразования его в синтаксис метода расширения.