Ответ 1
Это будет выглядеть так:
var query = checks
.GroupBy(c => string.Format("{0} - {1}", c.CustomerId, c.CustomerName))
.Select (g => new { Customer = g.Key, Payments = g });
Как выглядел бы следующий запрос, если бы я использовал синтаксис метода расширения?
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 }
Это будет выглядеть так:
var query = checks
.GroupBy(c => string.Format("{0} - {1}", c.CustomerId, c.CustomerName))
.Select (g => new { Customer = g.Key, Payments = g });
Во-первых, основной ответ:
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 из здесь и установите его.
Затем создайте пример программы, например, небольшую консольную программу, содержащую код, который вы хотите проанализировать. Вот код, который я написал:
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 и попросить показать синтаксис С# 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 };
});
}
Теперь, конечно, этот код можно написать немного красивее с lambdas и тому подобное, например, @mquander показал, но с Reflector, по крайней мере, вы должны понимать, как задействованы вызовы методов.
Поскольку компилятор делает этот перевод для вас, запустите Reflector и посмотрите.
Я знаю, что это старый вопрос, но для новых читателей посмотрите этот код gitub.
Это использование Roslyn для синтаксиса запроса и преобразования его в синтаксис метода расширения.