4

次の単純なC# LINQクエリを例に取り、それが1 つの列を持つ SQL テーブルでdb.Numbersある想像してくださいNumber

var result = 
    from n in db.Numbers
        where n.Number < 5
        select n.Number;

これは、次のようなSQLクエリを生成するため、 C#で非常に効率的に実行されます。

select Number from Numbers where Number < 5 

データベースからすべての数値を選択し、 C#でそれらをフィルター処理することは、最初はそうしているように見えるかもしれません

Pythonは同様の構文をサポートしています。

result = [n.Number for n in Numbers if n.Number < 5]

ただし、ifここでの句がサーバー側ではなくクライアント側でフィルタリングを行うと、効率が大幅に低下します。

PythonLINQほど効率的なものはありますか? (私は現在、 PythonIronPythonBooを評価しているので、これらの言語のいずれかで機能する答えは問題ありません。)

4

6 に答える 6

6

sqlalchemyのsqlsoupは、Pythonで最も速い解決策を提供します。クリアな(っぽい)ワンライナーが必要な場合は、私は思います。ページを見てください。

それは次のようなものでなければなりません...

result = [n.Number for n in db.Numbers.filter(db.Numbers.Number < 5).all()]
于 2008-09-23T00:52:48.563 に答える
5

SQLAlchemyをよく見てください。これはおそらくあなたが望むことの多くを行うことができます。サーバー上で実行される昔ながらのSQLのPython構文を提供します。

于 2008-09-22T21:35:01.127 に答える
5

LINQ は、C# および VB.NET の言語機能です。これは、コンパイラによって認識され、特別に扱われる特別な構文です。また、式ツリーと呼ばれる別の言語機能にも依存しています。

式ツリーは、特別な構文ではないという点で少し異なります。それらは他のクラスのインスタンス化と同じように記述されますが、コンパイラは、ラムダを実行時の抽象構文ツリーのインスタンス化に変換することにより、内部で特別に扱います。これらを実行時に操作して、別の言語 (SQL など) でコマンドを生成できます。

C# および VB.NET コンパイラは、LINQ 構文を受け取り、それをラムダに変換してから、それらを式ツリーのインスタンス化に渡します。次に、これらのツリーを操作して SQL を生成する一連のフレームワーク クラスがあります。また、「LINQ プロバイダー」を提供する MS 製およびサード パーティ製の他のライブラリを見つけることもできます。これは、基本的に別の AST プロセッサをポップインして、SQL 以外の LINQ から何かを生成します。

したがって、これらのことを別の言語で行う際の障害の 1 つは、実行時の AST の構築/操作をサポートしているかどうかという問題です。Python や Boo の実装でそうなるかどうかはわかりませんが、そのような機能については聞いたことがありません。

于 2008-09-22T21:40:10.977 に答える
4

IronPython 2.0 が完成すると、LINQ がサポートされると思います (議論の例については、このスレッドを参照してください)。今、あなたは次のようなものを書くことができるはずです:

Queryable.Select(Queryable.Where(someInputSequence, somePredicate), someFuncThatReturnsTheSequenceElement) 

IronPython 2.0b4 にはもっと良いものが含まれている可能性があります。名前の競合がどのように処理されたかについて、現在多くの議論があります。

于 2008-09-23T00:11:39.660 に答える
1

LINQの重要な要素は、式ツリーを生成するコンパイラーの機能です。特定のNemerle式をExpressionツリーオブジェクトに変換するNemerleのマクロを使用しています。次に、これをIQueryablesのWhere / Select/etc拡張メソッドに渡すことができます。これはC#とVBの構文ではありませんが、私には十分に近いものです。

この投稿のリンクからNemerleマクロを入手しました:http: //groups.google.com/group/nemerle-dev/browse_thread/thread/99b9dcfe204a578e

Boo用に同様のマクロを作成できるはずです。ただし、サポートする必要のある式のセットが多数あることを考えると、これはかなりの作業です。Ayendeはここで概念実証を提供しています:http: //ayende.com/Blog/archive/2008/08/05/Ugly-Linq.aspx

于 2008-10-25T01:12:45.710 に答える
1

Boo は、Python と同じ構文を使用するリスト ジェネレータ式をサポートしています。詳細については、ジェネレーター式リスト内包表記に関する Boo のドキュメントを参照してください。

于 2008-10-31T18:55:58.060 に答える