С LINQ компилятор проверяет, скомпилировано ли лямбда-выражение в IEnumerable или в IQueryable. Первые работы, как коллекции Scala. Второй компилирует выражение в дерево выражений (то есть структуру данных). Сила LINQ заключается в том, что сам компилятор может переводить лямбда-выражения в деревья выражений. Вы можете написать библиотеку, которая создает деревья выражений с интерфейсом, похожим на тот, который у вас есть для коллекции, но как вы собираетесь заставить компилятор строить структуры данных (вместо кода JVM) из лямбд?
При этом я не уверен, что Scala предоставляет в этом отношении. Возможно, в Scala можно построить структуры данных из лямбд, но в любом случае я считаю, что вам нужна аналогичная функция в компиляторе для обеспечения поддержки баз данных. Помните, что базы данных - не единственный источник данных, для которого вы можете создавать провайдеров. Существует множество поставщиков LINQ, например Active Directory или Ebay API.
Edit:
Почему не может быть только API?
Для выполнения запросов вы не только используете методы API (фильтр, где и т. Д.), Но также используете лямбда-выражения в качестве аргументов этих методов. Где (x => x> 3) (C # LINQ ). Компиляторы переводят лямбда-выражения в байт-код. API должен создавать структуры данных (деревья выражений), чтобы вы могли преобразовать структуру данных в базовый источник данных. По сути, вам нужен компилятор, чтобы сделать это за вас.
Отказ от ответственности 1:
Может быть (просто возможно) есть какой-то способ создания прокси-объектов, которые выполняют лямбда-выражения, но перегружают операторы для создания структур данных. Это приведет к несколько худшей производительности, чем фактическое LINQ (время выполнения или время компиляции). Я не уверен, возможна ли такая библиотека. Возможно, библиотека ScalaQuery использует аналогичный подход.
Отказ от ответственности 2:
Возможно, язык Scala на самом деле может предоставлять лямбды в качестве проверяемых объектов, чтобы вы могли получить дерево выражений. Это сделало бы лямбда-функцию в Scala эквивалентной функции в C #. Возможно, библиотека ScalaQuery использует эту гипотетическую функцию.
Редактировать 2:
Я немного покопался. Похоже, что ScalaQuery использует библиотечный подход и перегружает группу операторов для создания деревьев во время выполнения. Я не совсем уверен в деталях, потому что я не знаком с терминологией Scala и с трудом читаю сложный код Scala в статье:
http://szeiger.de/blog/2008/12/21/a-type-safe-database-query-dsl-for-scala/
Как и любой объект, который может использоваться или возвращаться в запросе, таблица параметризована с типом значений, которые она представляет. Это всегда кортеж отдельных типов столбцов, в нашем случае Integer и Strings (обратите внимание на использование java.lang.Integer вместо Int; подробнее об этом позже). В этом отношении SQuery (как я его сейчас назвал) ближе к HaskellDB, чем к LINQ, потому что Scala (как и большинство языков) не дает вам доступа к AST выражения во время выполнения. В LINQ вы можете писать запросы, используя реальные типы значений и столбцов в вашей базе данных, и преобразовывать AST выражения запроса в SQL во время выполнения. Без этой опции мы должны использовать мета-объекты, такие как Table и Column, чтобы построить из них наш собственный AST.
Очень классная библиотека. Я надеюсь, что в будущем он получит любовь, которую заслуживает, и станет инструментом, готовым к реальному производству.