Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
A port of LINQ (Language-Integrated Query) to Java
branch: master

This branch is 132 commits behind julianhyde:master

Add groupBy method to Enumerable that populates an accumulator, rathe…

…r than building an expensive list of all records in the group. It is similar to Enumerable.aggregate, except that it supports keys. Also a similar groupBy method that has an additional EqualityComparer parameter.

Add an enum Primitive to make it easier to manage primitive classes (e.g. int) and their boxing classes (e.g. Integer). Fix how constants are generated, and how say Long is converted to Integer.
latest commit 06a67b799e
@julianhyde julianhyde authored


A port of LINQ (Language-Integrated Query) to Java.


$ git clone git:// linq4j

Build and test

$ mvn compile
$ mvn test


If you would like to contribute, here are some of the tasks we have planned. Please let us know if you are starting one.

  • Implement and test the methods allowing queries on Enumerables. The methods are specified in ExtendedEnumerable, DefaultEnumerable calls the implementations in Extensions. We'll do these in tranches. Each time you implement a method, add a test similar to Linq4jTest.testWhere. Try to refactor out some helper (named inner) classes, rather than creating 2 or 3 anonymous classes per method.

  • Third tranche: implement groupBy for Enumerable.

  • Fourth tranche: implement any, all, aggregate, sum, min, max, average for Enumerable.

  • Sixth tranche: implement union, intersect, except, distinct methods for Enumerable.

  • Seventh tranche: first, last, defaultIfEmpty, elementAtOrDefault, firstOrDefault, lastOrDefault for Enumerable. May need to add a class parameter so that we can generate the right default value.

  • Eighth tranche: implement orderBy, reverse for Enumerable.

  • Ninth tranche: implement methods that require EqualityComparer.

  • Last tranche: all remaining methods for Enumerable.

  • Parser support. Either modify a Java parser (e.g. OpenJDK), or write a pre-processor. Generate Java code that includes expression trees.

  • Port Enumerable and Queryable to Scala. Change classes (in particular, collections and function types) so that user code is looks like concise, native Scala. Share as much of the back-end as possible with linq4j, but don't compromise the Scala look-and-feel of the front-end. Use adapters (and sacrifice a bit of performance) if it helps.

  • Write a simple LINQ-to-SQL provider. This would generate SQL and get data from JDBC. It's a prototype, demonstrating that we can connect the dots. Plan to throw it away.

  • In the prototype LINQ-to-SQL provider, write a simple rule to recognize a select list and where clause and push them down to SQL.

  • Test Scala front-end against LINQ-to-SQL provider.

  • A better provider using a planner framework.

  • JDBC driver on top of linq4j (not necessarily on top of the Queryable/Expression object model; more likely on the query model that this translates to).

  • Use planner framework to build back-ends to non-SQL data sources (e.g. MongoDB, Hadoop, text files).

Already implemented

Methods on Enumerable:

  • select, selectMany, where, groupJoin, join;
  • count, longCount;
  • cast, ofType;
  • toMap, toLookup, skip, skipWhile, take, takeWhile.

Methods on Queryable:

  • where, whereN
  • skip, skipWhile, skipWhileN, take, takeWhile, takeWhileN.

(Except methods that involve EqualityComparer.)

More information

Something went wrong with that request. Please try again.