Vitek has another great post in his series over at http://blogs.msdn.com/b/vitek/archive/2010/06/16/data-services-expressions-part-6-key-lookup.aspx.
There are a couple of things that I think are worth calling out.
- The provider doesn’t know if it needs to produce many items or just one. It can figure it out by looking at the expression and see if there’s a key filter of course, but generally it doesn’t know. This is because the difference between /Customers(1) and /Customers?$filter=ID eq 1 affects the serialization more than anything else, when choosing to return a feed or an entry. The query should behave the same way, so it’s only the runtime that keeps track of this information.
- Each key value in a compound-key entity is a separate Where operation (mostly). Logically these can be merged into a single Where operation with an And operator for each equality, and the results should be the same – the provider is free to do that of course. You would get the longer expression if someone queried for /Customers?$partitionid eq 1 and rowid eq 2 instead of /Customers(partitionid=1,rowid=2).
Thankfully, most everyone will work with an existing provider like the ADO.NET Entity Framework, so you’ll never have to worry about these details.