在实体集上执行 CRUD
查询实体集
将以下方法添加到 ProductsController 。
[EnableQuery]
public IQueryable<Product> Get()
{
    return db.Products;
}
[EnableQuery]
public SingleResult<Product> Get([FromODataUri] int key)
{
    IQueryable<Product> result = db.Products.Where(p => p.Id == key);
    return SingleResult.Create(result);
}
Get 方法的无参数版本返回整个 Products 集合。带有 key 参数的 Get 方法按其键查找产品(在本例中为 Id 属性)。
在 [EnableQuery] 属性让客户修改查询,通过查询选项,如$过滤,排序$和$页。有关更多信息,请参阅支持 OData 查询选项 。
将实体添加到实体集
要使客户端能够将新产品添加到数据库,请将以下方法添加到 ProductsController 。
public async Task<IHttpActionResult> Post(Product product)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    db.Products.Add(product);
    await db.SaveChangesAsync();
    return Created(product);
}
更新实体
OData 支持两种不同的语义来更新实体 PATCH 和 PUT。
- PATCH 执行部分更新。客户端仅指定要更新的属性。
 - PUT 取代整个实体。
 
PUT 的缺点是客户端必须为实体中的所有属性发送值,包括不更改的值。该 OData 的规范指出,补丁是首选。
无论如何,这里是 PATCH 和 PUT 方法的代码:
public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<Product> product)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    var entity = await db.Products.FindAsync(key);
    if (entity == null)
    {
        return NotFound();
    }
    product.Patch(entity);
    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(key))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }
    return Updated(entity);
}
public async Task<IHttpActionResult> Put([FromODataUri] int key, Product update)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    if (key != update.Id)
    {
        return BadRequest();
    }
    db.Entry(update).State = EntityState.Modified;
    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(key))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }
    return Updated(update);
}
在 PATCH 的情况下,控制器使用 Delta <T> 类型来跟踪更改。
删除实体
要使客户端能够从数据库中删除产品,请将以下方法添加到 ProductsController 。
public async Task<IHttpActionResult> Delete([FromODataUri] int key)
{
    var product = await db.Products.FindAsync(key);
    if (product == null)
    {
        return NotFound();
    }
    db.Products.Remove(product);
    await db.SaveChangesAsync();
    return StatusCode(HttpStatusCode.NoContent);
}