2009-07-13 10 views
4

独自のLinq句を作成する方法はありますか?私は拡張メソッドを探していて、それは私が探しているものではありません。私は自分のLinq Clausesをどうやって作るのですか?

私はwhere、selectまたはfrom節のようなものを考えていました。私のようなコードを使用したい

var blah = from bleep in bloops 
      where bleep == razzie 
      myclause bleep.property 
      select bleep; 

答えて

4

コンパイラがクエリ文を解釈する方法を変更することはできません。これらはクエリの補完と呼ばれ、これらを変換するための規則はC#コンパイラに直接組み込まれています。すべてのクエリは、Linqライブラリ内の拡張メソッドへの呼び出しの適切なシーケンスに変換されます。

Reflectorのようなツールを使用すると、そのような式が変換される拡張メソッド呼び出しの対応するシーケンスが表示されます。

クエリの理解の規則は、C# 3.0 specificationに完全に記載されています。

言語でクエリの構文を拡張すると便利な場合があることに私は同意しますが、適切な関数呼び出し構文に変換するには相当な量の洗練されたコンパイル時処理が必要です。私は、ほとんどの場合、表現全体がどのように変換されるかに影響を与えずに、特殊なケースに対して単に処理を挿入するのは簡単だとは思わない。

その間、Linqの機能を拡張するために、連鎖と通常の拡張メソッドを使用できることに気づきましょう。

2

これを行うには、C#コンパイラのソースコードにアクセスする必要があります。私はExtensionメソッドに固執します。 Reflectorのコピーがある場合は、System.Data.Linqを参照して、元の拡張メソッドがどのように記述されているかを確認できます。

0

拡張メソッドを使用できなかった理由はわかりません。

は... は

var blah = bloops.Where(b => b == razzie); 
...

var blah = (from bleep in bloops 
      where bleep == razzie 
      select bleep).myclause(bleep.property); 
+0

私は参加の特殊なタイプを作りたかったらどう?またはSQLがIQueryableに対して役立つかもしれないさまざまな機能を模倣しようとしますか? –

+0

@Russ:拡張メソッドを使ってすべてを行うことができます。クエリ構文には変換されません。例: 'var blah = bloops.YourSpecialJoin(blobs).Where(bleep => bleep == razzie);' – LukeH

0

構文はちょうど周りにいくつかの砂糖であることを

そして、それは拡張できません:あなたはこのような何かにあなたが持っているものから、それを変換します上記のクエリを使用して

あなたはもちろん、あなたはsyntacical sugarを持っていないあなた自身の句(ちょうど拡張メソッド)を追加することができます。

0

これはC#では不可能ですが、実際に構文を追加したい場合は、余分なクエリの理解キーワードを含むC#プリコンパイラを作成できます。これをC#と同じように実装するには(the specificationのように)、ソースオブジェクトの戻り値の型または呼び出しチェーン内の以前の戻り値の型として、有効なMyClause()拡張メソッドを検索します。 、IEnumerable<T>

あなたの例:

var blah = from bleep in bloops 
      where bleep == razzie 
      myclause bleep.property 
      select bleep; 

はなる:

var blah = bloops.Where(bleep => bleep==razzie) 
       .MyClause(bleep => bleep.property) 
       .Select(bleep => bleep); 
関連する問題