LINQ类似于斯卡拉?

是否有任何理智的类似于LINQ(.NET)的Scala存在?

这取决于“LINQ”究竟是什么意思。 LINQ是很多东西。

最明显的答案是:只需使用Scala的.NET端口即可。 它给你完全本地访问.NET中的所有东西,这显然包括LINQ。

不幸的是,Scala的.NET端口在几年前就被抛弃了。 幸运的是,它在几个月前再次被拿起,直接来自微软的官方资金也不less。 您可以预计2011/2012时间段的某个版本。

无论如何,什么是LINQ?

添加到.NET,特别是用于 LINQ的C#和VB.NET的一些function 。 它们在技术上并不是LINQ的一部分,但是它们是必要的先决条件:types推断,匿名(结构)types,lambdaexpression式,函数types( Func<T...>Action<T...> )和expression式树。 所有这些在斯卡拉已经很长一段时间了,大多数已经永远在那里。

也不是LINQ的直接部分,但在C#中,可以使用LINQ查询expression式来生成XML,以模拟VB.NET的XML文字。 Scala有XML文字,就像VB.NET一样。

更具体地说,LINQ是

  • 一组标准查询操作符的规范
  • 这些操作符的一组实现(即IQueryable ,LINQ到XML,LINQ到SQL,LINQ到对象)
  • 一个用于LINQ查询parsing的embedded式语法
  • 一个monad

在Scala中,和其他几乎所有的函数式语言一样(事实上也是几乎所有其他面向对象的语言),查询操作符只是标准集合API的一部分。 在.NET中,它们有一些奇怪的名称,而在Scala中,它们具有与其他语言相同的标准名称: SelectmapAggregatereduce (或fold ), SelectManyflatMapWherefilterwithFilterorderBysort还是sortBysortWith ,有ziptaketakeWhile等等。 所以,这需要处理规范和LINQ到对象的实现。 Scala的XML库也实现了集合API,它负责处理LINQ到XML。

SQL API没有内置到Scala中,但是有第三方API实现了收集API。

Scala对这些API也有专门的语法,但是与Haskell不同,Haskell试图使它们看起来像命令性的C块和C#,它试图使它们看起来像SQL查询,Scala试图使它们看起来像循环。 他们被要求理解 ,相当于C#的查询理解和Haskell的monad理解。 (他们也取代了C#的foreach和生成器( yield return ))。

但是如果你真的想知道在Scala中是否有类似于LINQ的东西,你首先必须明确你的意思是什么“LINQ”。 (当然,如果你想知道他们是否“理智”,你也必须定义这个)。

所有LINQ IEnumerable扩展在Scala中都可用。 例如:

LINQ:

 var total = orders .Where(o => o.Customer == "myCustomer") .SelectMany(o => o.OrderItems) .Aggregate(0, (sum, current) => sum + current.Price * current.Count); 

斯卡拉:

 val total = orders .filter(o => o.customer == "myCustomer") .flatMap(o => o.orderItems) .foldLeft(0)((s, c) => s + c.price * c.count) 

华而不实的

是Scala的一个现代数据库查询和访问库。 ( http://slick.typesafe.com/

 @table("COFFEES") case class Coffee( @column("COF_NAME") name: String, @column("SUP_ID") supID: Int, @column("PRICE") price: Double ) val coffees = Queryable[Coffee] // for inserts use lifted embedding or SQL val l = for { c <- coffees if c.supID == 101 // ^ comparing Int to Int! } yield (c.name, c.price) backend.result( l, session ) .foreach { case (n, p) => println(n + ": " + p) } 

在Scala中有很多情况下,你可以使用monadic构造作为一种查询语言。

例如,要查询XML(在这种情况下,从一些XHTML中的链接中提取URL):

 def findURLs(xml: NodeSeq): Seq[URL] = for { a <- xml \\ "a" href <- a attribute "href" url <- href.text } yield URL(url) 

对于LINQ to SQL的模拟,最接近的可能是ScalaQuery 。 从文档中提取示例:

 val q4c = for { u <- Users o <- Orders if o.userID is u.id } yield u.first ~ o.orderID