The answer to this problem was in the construction of the OData URL string. OData allows the use of brackets (I didn't notice this in the documentation) to group logical OR conditions together. Omitting the brackets around the OR condition caused an incorrect interpretation of the query string.
Incorrect example:
$filter=date ge datetime'2012-01-01' and date le datetime'2012-12-31' and id eq 1 or id eq 2
Working example:
$filter=date ge datetime'2012-01-01' and date le datetime'2012-12-31' and (id eq 1 or id eq 2)