Skip to content
Jason Finch edited this page Aug 23, 2018 · 10 revisions

To optimize network communication OData protocol supports sending multiple updates in batches. This is not the same as wrapping updates in transactions (the underlying OData service provider may not even support transactions, and OData client would be completely unaware of this fact), however it's a very efficient method of sending multiple update requests in a single HTTP POST request. Simple.OData.Client has a special class ODataBatch to wrap multiple operations in a batch.


Insert multiple entries in a batch

Untyped syntax

var batch = new ODataBatch(serviceUri);
batch += c => c.InsertEntryAsync(
        "Products",
        new Entry()
        {
            { "ProductName", "Test1" },
            { "UnitPrice", 21m }
        },
        false);
batch += c => c.InsertEntryAsync(
        "Products",
        new Entry()
        {
            { "ProductName", "Test2" },
            { "UnitPrice", 22m }
        },
        false);
await batch.ExecuteAsync();

Typed syntax

var batch = new ODataBatch(_serviceUri);
batch += c => c
    .For<Product>()
    .Set(new Product() { ProductName = "Test1", UnitPrice = 21m })
    .InsertEntryAsync(false);
batch += c => c
    .For<Product>()
    .Set(new Product() { ProductName = "Test2", UnitPrice = 22m })
    .InsertEntryAsync(false);
await batch.ExecuteAsync();

Dynamic syntax

var x = ODataDynamic.Expression;
var batch = new ODataBatch(_serviceUri);
batch += c => c
    .For(x.Products)
    .Set(x.ProductName = "Test1", x.UnitPrice = 21m)
    .InsertEntryAsync(false);
batch += c => c
    .For<Product>()
    .Set(x.ProductName = "Test2", x.UnitPrice = 22m)
    .InsertEntryAsync(false);
await batch.ExecuteAsync();

Request URI: POST /$batch
Request content:

--batch_77b3aa21-b11a-4307-b0df-36a5c566667e
Content-Type: multipart/mixed; boundary=changeset_f4b2eee4-7345-4344-b592-be7b7348e53a

--changeset_f4b2eee4-7345-4344-b592-be7b7348e53a
Content-Type: application/http
Content-Transfer-Encoding:binary

POST http://nrkdt58341/Temporary_Listen_Addresses/SimpleODataTestService2/Products HTTP/1.1
Content-ID: 1
Content-Type: application/atom+xml;type=entry
Content-Length: 496

<entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
  <title />
  <updated>2012-10-15T15:03:45.3000000Z</updated>
  <author>
    <name />
  </author>
  <id />
  <content type="application/xml">
    <m:properties>
      <d:ProductName>Test3</d:ProductName>
      <d:UnitPrice m:type="Edm.Decimal">21</d:UnitPrice>
    </m:properties>
  </content>
</entry>
--changeset_f4b2eee4-7345-4344-b592-be7b7348e53a
Content-Type: application/http
Content-Transfer-Encoding:binary

POST http://nrkdt58341/Temporary_Listen_Addresses/SimpleODataTestService2/Products HTTP/1.1
Content-ID: 2
Content-Type: application/atom+xml;type=entry
Content-Length: 496

<entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
  <title />
  <updated>2012-10-15T15:03:45.3660000Z</updated>
  <author>
    <name />
  </author>
  <id />
  <content type="application/xml">
    <m:properties>
      <d:ProductName>Test4</d:ProductName>
      <d:UnitPrice m:type="Edm.Decimal">22</d:UnitPrice>
    </m:properties>
  </content>
</entry>
--changeset_f4b2eee4-7345-4344-b592-be7b7348e53a--
--batch_77b3aa21-b11a-4307-b0df-36a5c566667e--

Insert multiple entries and create a link between them in a batch

Untyped syntax

IDictionary<string, object> category = null;
var batch = new ODataBatch(serviceUri);
batch += async x => category = await x.InsertEntryAsync(
        "Categories",
        new Entry()
        {
            { "CategoryName", "Test15" }
        });
batch += c => c.InsertEntryAsync(
        "Products",
        new Entry()
        {
            { "ProductName", "Test16" },
            { "UnitPrice", 18m },
            { "Category", category }
        },
        false);
await batch.ExecuteAsync();

Typed syntax

var category = new Category() { CategoryName = "Test15" };
var batch = new ODataBatch(serviceUri);
batch += async c => await c
    .For<Category>()
    .Set(category)
    .InsertEntryAsync();
batch += c => c
    .For<Product>()
    .Set(new { ProductName = "Test16", UnitPrice = 18m, Category = category })
    .InsertEntryAsync()
await batch.ExecuteAsync();

Dynamic syntax

var x = ODataDynamic.Expression;
var category = new Category() { CategoryName = "Test15" };
var batch = new ODataBatch(serviceUri);
batch += async c => await c
    .For(x.Categories)
    .Set(category)
    .InsertEntryAsync();
batch += c => c
    .For(x.Products)
    .Set(x.ProductName = "Test16", x.UnitPrice = 18m, x.Category = category)
    .InsertEntryAsync();
await batch.ExecuteAsync();

Request URI: POST /$batch
Request content:

--batch_6c440ee2-34a4-41a6-b891-331a5b54ee29
Content-Type: multipart/mixed; boundary=changeset_98134adc-dba3-419d-b44f-256fd4849c25

--changeset_98134adc-dba3-419d-b44f-256fd4849c25
Content-Type: application/http
Content-Transfer-Encoding:binary

POST http://nrkdt58341/Temporary_Listen_Addresses/SimpleODataTestService2/Categories HTTP/1.1
Content-ID: 1
Content-Type: application/atom+xml;type=entry
Content-Length: 441

<entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
  <title />
  <updated>2012-10-15T15:09:14.9040000Z</updated>
  <author>
    <name />
  </author>
  <id />
  <content type="application/xml">
    <m:properties>
      <d:CategoryName>Test15</d:CategoryName>
    </m:properties>
  </content>
</entry>
--changeset_98134adc-dba3-419d-b44f-256fd4849c25
Content-Type: application/http
Content-Transfer-Encoding:binary

POST http://nrkdt58341/Temporary_Listen_Addresses/SimpleODataTestService2/Products HTTP/1.1
Content-ID: 2
Content-Type: application/atom+xml;type=entry
Content-Length: 497

<entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
  <title />
  <updated>2012-10-15T15:09:15.0160000Z</updated>
  <author>
    <name />
  </author>
  <id />
  <content type="application/xml">
    <m:properties>
      <d:ProductName>Test16</d:ProductName>
      <d:UnitPrice m:type="Edm.Decimal">18</d:UnitPrice>
    </m:properties>
  </content>
</entry>
--changeset_98134adc-dba3-419d-b44f-256fd4849c25
Content-Type: application/http
Content-Transfer-Encoding:binary

PUT $2/$links/Category HTTP/1.1
Content-ID: 3
Content-Type: application/xml
Content-Length: 84

<uri xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">$1</uri>
--changeset_98134adc-dba3-419d-b44f-256fd4849c25--
--batch_6c440ee2-34a4-41a6-b891-331a5b54ee29--

See also:
Modifying data
OData batch processing