Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to address entity that uses composite identity key in OData Url?

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?

like image 232
ViktorZ Avatar asked Sep 20 '12 08:09

ViktorZ


2 Answers

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.

like image 152
Vitek Karas MSFT Avatar answered Sep 28 '22 11:09

Vitek Karas MSFT


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/

like image 29
Oana Avatar answered Sep 28 '22 11:09

Oana