2010-09-24 27 views
46

Có bất kỳ tương tự nào với LINQ (.NET) tồn tại cho Scala không?LINQ tương tự trong Scala?

+3

phương pháp LINQ cụ thể phù hợp với các scala tương đương: http://stackoverflow.com/questions/8104846/chart-of-ienumerable-linq-equivalents-in-scala –

+0

LINQ cho Scala (full API) và hỗ trợ thực thi hoãn lại: https://github.com/nicholas22/propelS – Scooterville

+2

Xem thêm: http://stackoverflow.com/a/8106548/192247. Có thể hữu ích. – missingfaktor

Trả lời

54

Nó phụ thuộc vào chính xác những gì bạn có ý nghĩa bởi "LINQ". LINQ là nhiều thứ.

Câu trả lời rõ ràng nhất sẽ là: chỉ cần sử dụng cổng .NET của Scala. Nó cung cấp cho bạn toàn quyền truy cập vào tất cả mọi thứ trong .NET, mà rõ ràng bao gồm LINQ.

Thật không may, cổng .NET của Scala đã bị loại bỏ một vài năm trước. May mắn thay, nó đã được chọn lại một vài tháng trước, với nguồn tài trợ chính thức trực tiếp từ Microsoft không kém. Bạn có thể mong đợi một bản phát hành trong khoảng thời gian 2011/2012.

Dù sao, LINQ là gì?

Một vài tính năng được thêm vào .NET và cụ thể là C# và VB.NET cho LINQ. Chúng không phải là một phần của LINQ, nhưng là điều kiện tiên quyết cần thiết: kiểu suy luận, kiểu vô danh (cấu trúc), biểu thức lambda, kiểu hàm (Func<T...>Action<T...>) và cây biểu thức. Tất cả những thứ này đã ở Scala trong một thời gian dài, hầu hết đã tồn tại mãi mãi.

Cũng không phải trực tiếp một phần của LINQ, nhưng trong C#, LINQ biểu thức truy vấn có thể được sử dụng để tạo XML, để mô phỏng các XML XML của VB.NET. Scala có XML literals, như VB.NET.

Cụ thể hơn, LINQ là

  • một đặc điểm kỹ thuật cho một tập hợp các toán truy vấn chuẩn
  • một bộ triển khai đối với những nhà khai thác (ví dụ IQueryable, LINQ-to-XML, LINQ-to-SQL, LINQ-to-Objects)
  • một built-in cú pháp nhúng cho LINQ truy vấn comprehensions
  • một đơn nguyên

Trong Scala, giống như trong bất kỳ ngôn ngữ chức năng nào khác (và trên thực tế cũng có khá nhiều ngôn ngữ hướng đối tượng khác), các toán tử truy vấn đơn giản là một phần của API bộ sưu tập tiêu chuẩn. Trong .NET, họ có một chút tên hơi lạ, trong khi ở Scala, họ có những cái tên cùng một tiêu chuẩn mà họ có trong các ngôn ngữ khác: Selectmap, Aggregatereduce (hoặc fold), SelectManyflatMap, Wherefilter hoặc withFilter, orderBysort hoặc sortBy hoặc sortWith và có zip, taketakeWhile v.v. Vì vậy, đó sẽ chăm sóc của cả hai đặc điểm kỹ thuật và thực hiện LINQ-to-Objects. Thư viện XML của Scala cũng triển khai thực hiện các API bộ sưu tập, mà sẽ chăm sóc LINQ-to-XML.

API SQL không được tích hợp vào Scala, nhưng có API của bên thứ ba triển khai API thu thập.

Scala cũng có cú pháp chuyên biệt cho các API đó, nhưng không giống như Haskell, cố gắng làm cho chúng trông giống như các khối C bắt buộc và C#, cố gắng làm cho chúng giống như truy vấn SQL, Scala cố gắng làm cho chúng trông giống như các vòng for. Chúng được gọi là for sự hiểu biết và tương đương với khả năng hiểu truy vấn của C# và tính đơn giản của Haskell. (Họ cũng thay thế foreach và máy phát điện của C# (yield return)).

Nhưng nếu bạn thực sự muốn biết có hay không có tương tự cho LINQ trong Scala, trước tiên bạn sẽ phải xác định chính xác ý nghĩa của "LINQ". (Và tất nhiên, nếu bạn muốn biết cho dù họ là "lành mạnh", bạn sẽ phải xác định rằng, quá.)

+19

Phần hữu ích nhất của câu trả lời là "Chọn là bản đồ, Bộ lọc ở đâu hoặc với Bộ lọc, orderBy sắp xếp hoặc sắp xếpBởi hoặc sắp xếp , ... ". Tôi chỉ thiếu Count(), First(), FirstOrDefault(). –

+11

'size',' head', 'headOption.getOrElse'.Đây là tất cả trong [scala.collection.Iterable] (http://www.scala-lang.org/api/current/scala/collection/Iterable.html) – stevej

+5

Một * lợi thế lớn * LINQ có là nó hỗ trợ deconstruction thành cây biểu thị cho phép tất cả các phép thuật LINQ2SQL "chỉ hoạt động". Cú pháp sang một bên, mức độ tích hợp cây biểu hiện này hiện không có sẵn trong Scala nên tất cả "các nhà cung cấp tương ứng" phải có hiệu quả xử lý AST của riêng mình mà không có mức trừu tượng này. –

8

Có nhiều trường hợp ở Scala, nơi bạn có thể sử dụng các cấu trúc đơn lẻ như một loại ngôn ngữ truy vấn.

Ví dụ, để truy vấn XML (trong trường hợp này, giải nén URL từ các liên kết trong một số XHTML):

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

Đối với một chất tương tự của LINQ to SQL, điều gần gũi nhất có lẽ là ScalaQuery. Để đưa ra ví dụ ngay trên tài liệu:

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

Tất cả LINQ IEnumerable tiện ích mở rộng có sẵn trong Scala. Ví dụ:

LINQ:

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

scala:

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

@oleksii forAll và tồn tại. http://www.scala-lang.org/docu/files/collections-api/collections.html – onof

10

Slick

là một truy vấn cơ sở dữ liệu và truy cập thư viện hiện đại cho 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) } 
Các vấn đề liên quan