PHP中有什么相当于C#中的LINQ?

PHP中有什么相当于C#中的LINQ ?

PHP有PHPLinq – LINQ 。

试试YaLinqo 。 这是PHP的最好的LINQ。

这是一个比较表:

在这里输入图像说明

(这里是YaLinqo开发者)

目前,在PHP中有三个主要的LINQ实现:

  • YaLinqo – 最简约的图书馆体系结构(4类),但最有特色,最高性能,最好的文档和唯一支持“stringlambdas”。

  • Ginq是一个平均规模的库(70个类),其function数量与YaLinqo相当,大约是速度的1.5-3倍,包含自定义集合,迭代器和比较器,文档最多只包含参数types。

  • Pinq – 一个庞大的库(500个类),支持parsingPHP和转换成SQL等等,比其他的慢得多,有一个漂亮的网站,但其文档是平均的,function缺乏。

其他库不值得一提(呃,好的,LINQ for PHP,Phinq,PHPLinq和Plinq)。 他们几乎没有经过testing,他们的评估不是懒惰的,他们依赖奇怪的概念,对PHP和.NET开发人员都是陌生的。 PHPLinq是实际支持数据库的唯一一个,但更像是用固定的呼叫顺序而不是LINQ生成SQL的DAL。

如果你问我select什么types的库,如果你需要使用数组和对象以及任何ORM库(而不是LINQ),那么我只是说要使用YaLinqo。 但我会试着解释为什么。

性能

亚林库是迄今为止最快的图书馆。 它的devise很快:它只依赖于生成器(生成最快的迭代器); 它只使用数组(没有自定义集合作为数组的包装实现)。 它的进化正在摆脱缓慢和过时的function:删除自定义集合,删除显式迭代器; 如果提高了性能,代码质量就会恶化:在多个sorting函数之间进行select,而不是使用一个通用解决scheme,复制粘贴代码以减less函数调用次数。

Ginq和Pinq采取了另一种方法,他们使用显式迭代器类。 它在性能上咬了一大块,但允许使用迭代器与stream利的方法语法分开。

此外,他们都有性能陷阱 。 在Ginq中使用属性访问器语法时,代码变慢了5倍。 当您尝试使用数组作为键时,还有等待您的惊喜。 当你使用Pinqjoin时,你的代码变慢了几百或几千倍(我不是在开玩笑,见下面的链接)joinPinq的性能在我的bug报告后被修复。

对于YaLinqo来说,它更简单:或者它不起作用(像键中的数组),或者它与预期的性能一起工作。 版本1确实有一些黑客可能,就像原来的LINQ,但目前的版本并没有。 可能需要进行一些调整:例如,不要使用相等比较器,而是需要生成相同的键。

查看文章: LINQ for PHP比较:YaLinqo,Ginq,CodeProject上的Pinq, PHP的LINQ: Habrahabr(俄语)的速度问题 。 他们涵盖了YaLinqoPerf ,git存储库,比较了原始PHP,YaLinqo,Ginq和Pinq的性能testing。

特征

YaLinqo和Ginq中LINQ方法的数量以及它们的function非常接近。 我认为没有明确的赢家,因为两个图书馆都提供了另​​一个没有的方法。 他们大多是额外的方法在原来的LINQ中不可用,所以我不会担心太多。

Pinq看起来像一个荒凉的小镇。 方法是准系统,通常几乎不可用。 在编写性能testing时,我经常不得不求助于针对Pinq的定制更复杂的解决scheme,而YaLinqo和Pinq的代码通常只在方法名称(不同的命名约定:“desc”和“降序”等等)方面不同。

另一方面,Pinq是唯一支持parsingPHP并从中生成SQL的人。 不幸的是,唯一的查询提供者是MySQL,它的状态是一个“示范”。 所以,虽然Pinq有这个独特的function,但不幸的是,它还不能使用。

如果你想LINQ to数据库成为现实,我想你别无select,只能开始在Pinq的查询提供商工作。 这是一个非常复杂的任务,我怀疑一个开发人员是否能够为所有数据库单独生成高质量的查询提供程序。

雅林不是更先进的build筑。 在Ginq中使用SetDictionary类的时候,你会在YaLinqo中看到数组和数组。 在Ginq中使用ComparerEqualityComparer ,你会在YaLinqo中看到闭包(或者没有等价的)。 其核心是一个devise决定 – 图书馆是否应该使用这种语言的程序员自然的概念,或者使用其他语言的图书馆的程序员。 图书馆只是做出了select。

应该指出的是,更复杂的架构并不等于一个好的实现。 Ginq使用public function hash($v) { return sha1(serialize($v)); } 例如,用于计算“集合”中的密钥哈希值。

文档

YaLinqo在PHPDoc和在线(从PHPDoc生成)中提供了一个很好的参考文档。 这主要是从MSDN的.NET中的LINQ的文档适应PHP。 如果你知道MSDN是什么,你就知道它的质量。

Ginq的文档几乎不存在,它通常只包含参数types提示。

Pinq的文档相对比较好(每种主要的方法都有一两句话来解释它的function),但是与YaLinqo的文档不同。

Ginq和Pinq在networking上都有很好的介绍性文章,向新开发者解释概念。 除了ReadMe中的一个疯狂的例子,YaLinqo没有任何介绍性的文档,它没有解释任何东西。

Pinq也有一个漂亮的网站,是三个图书馆中唯一的一个。

其他一切

所有这三个库都具有良好的testing覆盖率,Composer集成,许可的开放源代码许可以及可随时用于生产的libararies的其他属性。

对于那些关心古代PHP版本的人,YaLinqo 1.x需要PHP 5.3,YaLinqo 2.x需要PHP 5.5,Ginq需要PHP 5.3,Pinq需要PHP 5.4。

PS如果你有任何补充,或认为我有偏见,请评论。 写了这么多的文字后,我想念的是评论。 🙂

在过去的几年中,PHP世界发生了很多变化,使以前的大部分答案都过时了。

以下是PHP的主要LINQ实现的新比较表:

LINQ库比较表

这些库都可以通过作曲者安装。

总之,我会推荐PINQ库(因为我是作者,所以我有点偏袒),因为它被积极维护,有文档logging和testing,并提供了PHP中真正的LINQ的实现。

通过真正的 LINQ,我的意思是库不仅是一个stream畅的内存数组的收集API,而且还实现了真正的查询分析与expression式树。 这允许将此API与外部数据源进行集成,因此可以将P HP集成到Q uery中。 这种function的演示可以在这里查看,查询被编译成SQL并运行在MySQL数据库上:

还有phinq有一个更新的版本,PHPLinq,看起来更像LINQ to C#的Objects for C#而不是PHPLinq。

良好的PHP ORM库?

这个问题的答案说

研究教义。

Doctrine 1.2实现了Active Record。 Doctrine 2+是一个DataMapper ORM。

另外,检查Xyster。 它基于数据映射器模式。

另外,看看DataMapper与Active Record。

还有Pinq 。 在简单介绍大部分PHP Linq项目文档之后,这一个给我留下了最好的印象。

请参阅PHPLinq (一组模仿C#3.0的LINQ的PHP类)。