2009-06-08 20 views
17

拡張メソッド構文を使用していた場合、次のクエリはどのように見えますか?linqメソッド構文(クエリ構文ではない)のGroupBy

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

はその後、どのようにこれらの事を自分で把握できますか?

まず、リフレクターを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のオプションページに移動し、Linqを適切な静的メソッド呼び出しで置き換えるC#2.0構文を表示するように求めます。このコードは何@mquandershowedのように、ラムダと類似して少しきれいに書き込むことができ、もちろん、今

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

が、リフレクターで、少なくともあなたは理解することができるはずです。それを行うことは私に次のコードを提供しますメソッド呼び出しが関与しています。

+0

ReSharperには、クエリ構文との変換があります。 – bzlm

1

私はこれが古い質問だと知っていますが、新しい読者にとってはthis gitubコードを見てください。

これは、Roslynを使用してクエリ構文を取得し、それを拡張メソッド構文に変換します。

関連する問題