web-dev-qa-db-ja.com

PHP C#のLINQと同等のものはありますか?

[〜#〜] php [〜#〜] に何かありますか [〜#〜] linq [〜#〜] と同等ですか?

47
eomeroff

PHPLinq-LINQ for PHP があります。

27
Justin Niessner

YaLinqo を試してください。 PHP向けの最高のLINQです。

比較表は次のとおりです。

Enter image description here

34
cystbear

(YaLinqo開発者はこちら。)

現在、PHPにはLINQの3つの主要な実装があります。

  • YaLinqo —最もミニマルなライブラリアーキテクチャ(4クラス)ですが、最も機能的で、最もパフォーマンスが高く、最高のドキュメントと「文字列ラムダ」をサポートする唯一のもの。

  • Ginq — YaLinqoと同等の関数数の平均サイズ(70クラス)のライブラリ、約1.5– 3倍の速度で、カスタムコレクション、反復子、および比較子が含まれ、ドキュメントには最大でも引数の型が含まれます。

  • Pinq —巨大なライブラリ(500クラス)、解析をサポートPHPおよび変換SQLと他のすべてのものは、他のものよりはるかに遅いですが、きれいなWebサイトがありますが、そのドキュメントは平均的であり、機能が欠けています。

他のライブラリは言及する価値はありません(um、ok、PHPのLINQ、Phinq、PHPLinq、Plinq)。彼らはかろうじてテストされており、それらの評価は怠け者ではなく、PHPと.NET開発者の両方にとって異質な奇妙な概念に依存しています。PHPLinqは実際にデータベースをサポートする唯一のものですが、LINQではなく固定呼び出し順序でSQLを生成するためのDALに似ています。

どのライブラリを選択するかを聞かれた場合、データベースを操作する必要があるときに配列とオブジェクトおよびORMライブラリ(LINQではない)を操作する必要がある場合は、YaLinqoを使用するだけです。しかし、私はその理由を説明しようとします。

性能

YaLinqoは、群を抜いて最速のライブラリです。高速になるように設計されています。ジェネレーター(最高速のイテレーターを生成する)のみに依存しています。配列のみを使用します(配列のラッパーとして実装されたカスタムコレクションは使用しません)。その進化は、遅くて時代遅れの機能を取り除きつつあります。カスタムコレクションを削除し、明示的なイテレータを削除します。パフォーマンスが向上するとコード品質が低下します。1つの汎用ソリューションを使用する代わりに複数のソート関数を選択し、コードをコピーして貼り付けて関数呼び出しの数を減らします。

GinqとPinqは別のアプローチを取り、明示的な反復子クラスを使用します。パフォーマンスの大きな部分をかみますが、流なメソッド構文とは別にイテレータを使用できます。

さらに、両方にパフォーマンストラップがあります。 Ginqでプロパティアクセサー構文を使用すると、コードが5倍遅くなります。配列をキーとして使用しようとすると、あなたを待っている驚きもあります。 Pinqで結合を使用すると、コードが数百または数千倍遅くなります(冗談ではありません。以下のリンクを参照してください) Pinqへの参加のパフォーマンスは、バグレポートの後で修正されました。

YaLinqoの方が簡単です。(キーの配列のように)動作しないか、期待されるパフォーマンスで動作します。バージョン1には、元のLINQのように、それを可能にするためのハッキングがいくつかありましたが、現在のバージョンにはありません。いくつかの調整が必要になる場合があります。たとえば、等値比較器を使用する代わりに、同じ場合に等しいキーを生成する必要があります。

記事を参照してください: PHP比較:YaLinqo、Ginq、Pinq CodeProjectで、 LINQ for PHP:速度が重要 Habrahabr(ロシア語) 。 YaLinqoPerf 、未加工のPHP、YaLinqo、Ginq、およびPinqを比較するパフォーマンステストでgitリポジトリをカバーします。

特徴

YaLinqoとGinqのLINQメソッドの数、およびそれらの機能は非常に近いです。どちらのライブラリも他のライブラリにはないメソッドを提供するため、明確な勝者はいないと思います。それらは主に元のLINQでは利用できない追加のメソッドであるため、あまり心配する必要はありません。

ピンクは人けのない町のように見えます。メソッドは必要最小限であり、ほとんど使用できません。パフォーマンステストの作成中、Pinqのより複雑なカスタムソリューションに頼らざるを得なかったのに対し、YaLinqoとPinqのコードは通常メソッド名のみが異なりました(異なる命名規則:「desc」と「descending」など)。

一方、PinqはPHPの解析とそれからのSQLの生成をサポートする唯一のものです。残念なことに、唯一のクエリプロバイダーはMySQL用であり、その状態は「デモ」です。 Pinqにはこのユニークな機能がありますが、残念ながらまだ使用できません。

データベースへのLINQを実現したい場合、Pinqのクエリプロバイダーで作業を開始する以外に選択肢はないと思います。これは非常に複雑なタスクであり、ある開発者がすべてのデータベースだけで高品質のクエリプロバイダーを作成できるとは思えません。

GinqがYaLinqoにないことは、より高度なアーキテクチャです。 GinqでSetおよびDictionaryクラスが使用されている場合、YaLinqoには配列と配列のみが表示されます。 ComparerEqualityComparerがGinqで使用されている場合、YaLinqoにはクロージャー(または同等のクロージャー)が表示されます。核となるのは、この言語のプログラマーにとって自然な概念を使用すべきか、他の言語のライブラリーを使用するプログラマーにとって、ライブラリーが自然な概念を使用すべきかという設計上の決定です。ライブラリが選択をしただけです。

より複雑なアーキテクチャは、適切な実装とは異なることに注意してください。 Ginqは、たとえば「sets」のキーハッシュの計算にpublic function hash($v) { return sha1(serialize($v)); }を使用します。

ドキュメンテーション

YaLinqoは、PHPDocおよびオンライン(PHPDocから生成)の優れたリファレンスドキュメントで際立っています。これは主に、PHPに適応したMSDNの.NETのLINQのドキュメントです。 MSDNが何であるかを知っていれば、その品質を知っています。

Ginqのドキュメントはほとんど存在せず、通常は引数タイプのヒントのみが含まれています。

Pinqのドキュメントは比較的優れています(すべての主要なメソッドには、その機能を説明する1つまたは2つの文があります)が、YaLinqoのドキュメントには一致しません。

GinqとPinqの両方には、新しい開発者に概念を説明する優れた入門記事があります。 YaLinqoには、何も説明されていないReadMeのクレイジーな例以外に、入門書はありません。

Pinqには、3つのライブラリのうちの1つである美しいWebサイトもあります。

ほかのすべて

3つのライブラリはすべて、テスト範囲が良好です。Composer統合、寛容なオープンソースライセンス、および実稼働ですぐに使用できるライブラリの他のプロパティ。

古代のPHPバージョン、YaLinqo 1.xにはPHP 5.3、YaLinqo 2.xにはPHP 5.5、GinqではPHP 5.3、PinqではPHP 5.4。

追伸あなたが追加を持っているか、私が偏っていると思うなら、コメントしてください。コメントは、大量のテキストを書いた後に見逃したものです。 :)

29
Athari

過去数年間でPHPの世界で多くの変更が行われ、以前の回答のほとんどが古くなっています。

PHPの主要なLINQ実装の新しい比較表は次のとおりです。

LINQ Library Comparison Table

これらのライブラリはすべて composer でインストールできます。

要約すると、 [〜#〜] pinq [〜#〜] ライブラリ(作成者であるためバイアスがかかっています)が推奨されます。 PHPの真のLINQ。

BytrueLINQ私は、ライブラリがメモリ内配列の流collectionなコレクションAPIであるだけでなく、式ツリーを使用した実際のクエリ解析も実装していることを意味します。これにより、このAPIと外部データソースとの統合が可能になるため、[〜#〜] p [〜#〜]HPIntegrated[〜#〜] q [〜#〜 ]uery。このような機能のデモは、クエリがSQLにコンパイルされ、MySQLデータベースに対して実行される here で表示できます。

3
Elliot Levin

phinq もあり、これはPHPLinqよりも最近のリリースであり、C#の場合はPHPLinqよりも LINQ to Objects のように見えます。

2
nover

良いPHP ORMライブラリ?

この質問に対する答えは言う

Doctrineを調べてください。

Doctrine 1.2はActive Recordを実装しています。 Doctrine 2+はDataMapper ORMです。

また、Xysterもチェックしてください。これは、Data Mapperパターンに基づいています。

また、DataMapperとActive Recordを見てください。

1
Bastardo

PHPLinq (PHP C#3.0のLINQを模倣するクラスのセット)を参照してください。

0
moi_meme