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中,它们具有与其他语言相同的标准名称: Select是map , Aggregate是reduce (或fold ), SelectMany是flatMap , Where是filter或withFilter , orderBy是sort还是sortBy或sortWith ,有zip , take和takeWhile等等。 所以,这需要处理规范和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