oData, DataServices, or Roll Your Own

On my current project we have been debating how to query a service that is potentially exposed over rest and or soap that talks in terms of domain objects, but really queries against data entities.  What this means is that the queries at the business level are in terms of the domain object,  for instance, give me all students that have a GPA property greater than 3.   This query has to be transformed to the persistence layer, which may mean a sql query something like,

‘SELECT * FROM Student WHERE std_gpa > 3’.

The persistence layer may not use our domain objects, but it’s own entities that more closely reflect the database structure.  This means that any query written in the context of the business objects must be transformed into the context of the data entities.  What we have been trying to decide is if we should make our service query in terms of business objects and transform underneath or have our service expose our data entity objects directly and let callers transform on their own?

If we structure our service to talk in terms of business objects it will be harder to construct, since we’ll have to manage the transforms.  The service will be easier for any caller that already uses our business objects to understand, however, and if our persistence mechanism changes in any way we can hide that from the callers as well.  If we expose our data entities directly we will be able to publish the service faster, and it will be potentially more flexible as callers won’t be limited to queries that are only supported by the business object structure.