14
votes

I have an entity OrderItem that has OrderId and ProductId integer fields and these two fields form the identity key/primary key for this table.
I would like to use OData/Web API to expose such entities through a service and to be able to select OrderItem instances by they composite ID.

What should be the format of the URL?

Are there any best practices for handling such scenarios?

2

2 Answers

23
votes

Composite keys in the URL use syntax like this:

~/OrderItems(OrderId=1234,ProductId=1234)

The "grammar" is defined in the OData ABNF Construction Rules (see the definition for "compoundKey")

An example usage can be found in OASIS' OData Version 4.0. Part 2: URL Conventions Plus Errata 03

Note that the "composite key" (aka "complex key predicate") has been around since OData 1.0.

8
votes

First, you have to make sure that you explicitly mention that it has a composite key, in configuration file

builder.EntityType<OrderItem>().HasKey(t => new { t.OrderId, t.ProductId});

Then, the action should have the following header

public SingleResult<OrderItem> Get([FromODataUri] string keyOrderId, [FromODataUri] string keyProductId)

Please note the prefix(key) used for both parameters!

This is OData V4. Please also refer to https://odata.github.io/WebApi/13-06-KeyValueBinding/