2010-01-21 6 views

ответ

9

Это не поддерживается Scala. ScalaQL: Language-Integrated Database Queries for Scala описывает LINQ-как функциональность в Scala:

Хотя возможно для Microsoft, чтобы просто расширить свой язык с этим конкретной функции, смирен приложения разработчики не так повезло. Например, для нет никого (вне Sun Microsystems) до реализовать любую форму LINQ в Java из-за языковых модификаций , которые потребуются. Мы столкнулись с проблемой , которая пыталась выполнить реализовать LINQ в Scala.

К счастью, на самом деле Scala достаточно мощный сам по себе, чтобы реализовать форму LINQ даже без добавления поддержки деревьев выражений. Благодаря сочетанию оператор перегрузки, неявных преобразований, и контролируемые Call- по имени семантика, мы смогли достичь того же ЕЭТЧ без внесения каких-либо изменений в самого языка.

+1

Да, но автор не выпустил их исходный код; кроме того, на этой бумаге не хватает подробностей, необходимых для полной реализации - они даже не записывают фактический интерфейс своей библиотеки. Поддержка flatMap (которая не используется ни в одном из примеров), например, сложна. – Blaisorblade

+0

Я не уверен, что он реализует все, что делает LINQ, но просто хотел указать, что Slick использует вышеуказанные методы. Он реализует собственные функции map, filter, groupBy и т. Д., Которые неявно отбрасываются из обычных типов scala в специальный тип Rep. Таким образом, вы можете сделать 'coffees.filter (_. Price> 8.0) .map (_. Name)' и он превратится в SQL. [См. Документы] (http://slick.typesafe.com/doc/2.0.0/introduction.html#lifted-embedding). – ShawnFumo

1

Нет, насколько мне известно.

6

Существует экспериментальный scala.reflect.Code.lift, который может представлять интерес, но короткий ответ - нет, Scala не имеет доступа к AST в любой форме (деревья выражений являются подмножеством AST).

2

Мне не совсем понятно, что вы хотите. Если вы хотите функцию, которая возвращает поглотитель для поля, вы можете сделать это довольно легко:

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) 

Ключ превратить геттер h.s в функцию через (h.s _).

+0

Один из способов использования этого метода в .NET заключается в помощниках шаблонов MVC. Шаблон знает тип модели, скажем, User (у которого есть firstName). Таким образом, вы можете сделать 'helpers.textBoxFor (m => m.firstName)'. Это не только привязывает данные, но и использует имя свойства, создавая нечто вроде ''. Таким образом, вы получаете безопасность типов (и поддержку рефакторинга) без необходимых магических строк. – ShawnFumo

Смежные вопросы