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?
Trả lời
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...>
và 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: Select
là map
, Aggregate
là reduce
(hoặc fold
), SelectMany
là flatMap
, Where
là filter
hoặc withFilter
, orderBy
là sort
hoặc sortBy
hoặc sortWith
và có zip
, take
và takeWhile
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á.)
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(). –
'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
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. –
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
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)
@oleksii forAll và tồn tại. http://www.scala-lang.org/docu/files/collections-api/collections.html – onof
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) }
- 1. Công cụ Scala tương tự như Linqpad
- 2. Scala: jaxb hoặc tương tự?
- 3. Tương tự Scala của QtConcurrent
- 4. Biểu đồ về tương đương LINQ IEnumerable trong Scala?
- 5. LINQ/Lambda tương đương với SQL trong
- 6. Cách xác định Thứ tự trong Scala?
- 7. Có điều gì đó tương tự với LINQ trong Mục tiêu-C không?
- 8. Có tương tự trong Scala cho phương thức "trả về" của Rails không?
- 9. Sự khác biệt giữa các loại tương tự đã được xử lý trong Scala
- 10. Tiêu chí Scala tương đương
- 11. Scala tương đương với wsdl2java?
- 12. Scala, java của tương lai (?)
- 13. Có phương pháp tương đương LINQ không?
- 14. Scala - tương lai và đồng thời
- 15. haskell scala khả năng tương tác
- 16. Javascript Tương đương với C# LINQ Chọn
- 17. MemoryStream tương tự trong Python
- 18. Tương tự getCurrentLoggers trong log4j2
- 19. Trình tự với các luồng trong Scala
- 20. chuyển đổi xml tự động trong scala
- 21. Aliasing này trong scala với tự =>
- 22. Haskell tương đương với scala thu thập
- 23. DataLoadOptions tương đương với LINQ to Entities?
- 24. Nhập gói tương đối của Scala Nhập
- 25. Bắt đếm với NHibernate + LINQ + Tương lai
- 26. Scala Nil tương đương với Bộ
- 27. Powershell tương đương với lệnh Chọn LINQ?
- 28. Scala tương đương với HashSet mới (Collection)
- 29. Scala ListBuffer (hoặc tương đương) shuffle
- 30. Scala có introspection có khả năng tương tự như dir của Python()?
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 –
LINQ cho Scala (full API) và hỗ trợ thực thi hoãn lại: https://github.com/nicholas22/propelS – Scooterville
Xem thêm: http://stackoverflow.com/a/8106548/192247. Có thể hữu ích. – missingfaktor