2010-01-21 16 views

Respuesta

9

Esto no es compatible con Scala. ScalaQL: Language-Integrated Database Queries for Scala describe una funcionalidad similar a LINQ en Scala:

Si bien es posible que Microsoft una simple extensión de su lengua con esta característica particular, la aplicación humilde desarrolladores no son tan afortunados. Para ejemplo, no hay forma de que (fuera de Sun Microsystems) implemente cualquier forma de LINQ dentro de Java debido a las modificaciones de lenguaje que serían requeridas. Nos enfrentamos a un problema similar al intentando implementar LINQ en Scala.

Afortunadamente, Scala es en realidad lo suficientemente potente de por sí a poner en práctica una forma de LINQ incluso sin añadiendo soporte para árboles de expresión. A través de una combinación de operador sobrecarga, las conversiones implícitas, y Call-by-semántica controlados nombre, que han sido capaces de lograr el mismo TCEE sin hacer ningún cambio a la propia lengua.

+1

Sí, pero el autor no publicó su código fuente; además, ese documento carece de algunos detalles necesarios para una implementación completa: ni siquiera escriben la interfaz real de su biblioteca. Soportar flatMap (que no se utiliza en ninguno de los ejemplos) es, por ejemplo, complicado. – Blaisorblade

+0

No estoy seguro si implementa todo lo que LINQ hace, pero solo quería señalar que Slick usa los métodos anteriores. Implementa sus propias funciones de mapa, filtro, groupBy, etc. que implícitamente emiten desde tipos de scala regulares a un tipo de Rep especial. Entonces puede hacer 'coffees.filter (_. Price> 8.0) .map (_. Name)' y se convertirá en SQL. [Ver los documentos] (http://slick.typesafe.com/doc/2.0.0/introduction.html#lifted-embedding). – ShawnFumo

1

No, a lo mejor de mi conocimiento.

6

Existe un experimental scala.reflect.Code.lift que podría ser de interés, pero la respuesta corta es no, Scala no tiene acceso a la AST de ninguna forma (los árboles de expresión son un subconjunto de la AST de C#).

2

No tengo muy claro qué es lo que quiere. Si desea una función que devuelve un captador para un campo, se puede hacer eso con bastante facilidad:

class Holder(var s: String) { } 
class StringSaver(f: Holder => (() => String), h: Holder) { 
    val getter = f(h) 
    def lookAtString = getter() 
} 

val held = new Holder("Hello") 
val ss = new StringSaver((h: Holder) => (h.s _) , held) 
println(ss.lookAtString) 
held.s = "Bye now" 
println(ss.lookAtString) 

La clave es convertir los h.s getter en una función a través de (h.s _).

+0

Una forma de utilizar esto en .NET es en ayudantes de plantillas MVC. La plantilla conoce el tipo de modelo, digamos Usuario (que tiene un nombre). Entonces podrías hacer 'helpers.textBoxFor (m => m.firstName)'. Esto no solo enlaza datos sino que utiliza el nombre de la propiedad, creando algo como ''. De esta forma obtienes seguridad de tipo (y soporte de refactorización) sin necesidad de cadenas mágicas. – ShawnFumo

Cuestiones relacionadas