Skip to content

Including standard functions in search criteria

JonAdamsFromNC edited this page Jan 30, 2023 · 14 revisions

OData protocol supports standard functions that can be included in search criteria.


Find a product with the given name coverted to a lowercase format

Untyped syntax

var product = await client
    .For("Products")
    .Filter("tolower(ProductName)+eq+%27chai%27")
    .FindEntryAsync();
Assert.Equal("Chai", product["ProductName"]);

Typed syntax

var product = await client
    .For<Products>()
    .Filter(x => x.ProductName.ToLower() == "chai")
    .FindEntryAsync();
Assert.Equal("Chai", product.ProductName);

Dynamic syntax

var x = ODataDynamic.Expression;
var product = await client
    .For(x.Products)
    .Filter(x.ProductName.ToLower() == "chai")
    .FindEntryAsync();
Assert.Equal("Chai", product.ProductName);

Request URI: GET Products?$filter=tolower(ProductName)+eq+%27chai%27


Find products with the length of name equal to 4

Untyped syntax

var products = await client
    .For("Products")
    .Filter("length(ProductName)+eq+4")
    .FindEntriesAsync();
Assert.NotEmpty(products);

Typed syntax

var x = ODataDynamic.Expression;
var products = await client
    .For<Products>()
    .Filter(x => x.ProductName.Length() == 4)
    .FindEntriesAsync();
Assert.NotEmpty(products);

Dynamic syntax

var x = ODataDynamic.Expression;
var products = await client
    .For(x.Products)
    .Filter(x.ProductName.Length() == 4)
    .FindEntriesAsync();
Assert.NotEmpty(products);

Request URI: GET Products?$filter=length(ProductName)+eq+4


Find products with the name starting with the given string

Untyped syntax

var products = await client
    .For("Products")
    .Filter("startswith(ProductName%2c%27Ch%27)+eq+true")
    .FindEntriesAsync();
Assert.NotEmpty(products);

Typed syntax

var products = await client
    .For<Products>()
    .Filter(x => x.ProductName.StartsWith("Ch") == true)
    .FindEntriesAsync();
Assert.NotEmpty(products);

Dynamic syntax

var x = ODataDynamic.Expression;
var products = await client
    .For(x.Products)
    .Filter(x.ProductName.StartsWith("Ch") == true)
    .FindEntriesAsync();
Assert.NotEmpty(products);

Request URI: GET Products?$filter=startswith(ProductName%2c%27Ch%27)+eq+true


Find products with the name containing the given string

Untyped syntax

var products = await client
    .For("Products")
    .Filter("substringof(%27ai%27%2cProductName)+eq+true")
    .FindEntriesAsync();
Assert.NotEmpty(products);

Typed syntax

var products = await client
    .For<Products>()
    .Filter(x => x.ProductName.Contains("ai") == true)
    .FindEntriesAsync();
Assert.NotEmpty(products);

Dynamic syntax

var x = ODataDynamic.Expression;
var products = await client
    .For(x.Products)
    .Filter(x.ProductName.Contains("ai") == true)
    .FindEntriesAsync();
Assert.NotEmpty(products);

Request URI: GET Products?$filter=substringof(%27ai%27%2cProductName)+eq+true


Find products with the name not containing the given string

Untyped syntax

var products = await client
    .For("Products")
    .Filter("substringof(%27ai%27%2cProductName)+eq+false")
    .FindEntriesAsync();
Assert.NotEmpty(products);

Typed syntax

var products = await client
    .For<Products>()
    .Filter(x => x.ProductName.Contains("ai") == false)
    .FindEntriesAsync();
Assert.NotEmpty(products);

Dynamic syntax

var x = ODataDynamic.Expression;
var products = await client
    .For(x.Products)
    .Filter(x.ProductName.Contains("ai") == false)
    .FindEntriesAsync();
Assert.NotEmpty(products);

Request URI: GET Products?$filter=substringof(%27ai%27%2cProductName)+eq+false


Find products with the name containing the given string at the specified position

Untyped syntax

var products = await client
    .For("Products")
    .Filter("indexof(ProductName%2c%27ai%27)+eq+2")
    .FindEntriesAsync();
Assert.NotEmpty(products);

Typed syntax

var products = await client
    .For<Products>()
    .Filter(x => x.ProductName.IndexOf("ai") == 2)
    .FindEntriesAsync();
Assert.NotEmpty(products);

Dynamic syntax

var x = ODataDynamic.Expression;
var products = await client
    .For(x.Products)
    .Filter(x.ProductName.IndexOf("ai") == 2)
    .FindEntriesAsync();
Assert.NotEmpty(products);

Request URI: GET Products?$filter=indexof(ProductName%2c%27ai%27)+eq+2


Alternative syntax for finding products with the name containing the given string at the specified position

Untyped syntax

var products = await client
    .For("Products")
    .Filter("substring(ProductName%2c1)+eq+%27hai%27")
    .FindEntriesAsync();
Assert.NotEmpty(products);

Typed syntax

var products = await client
    .For<Products>()
    .Filter(x => x.ProductName.Substring(1) == "hai")
    .FindEntriesAsync();
Assert.NotEmpty(products);

Dynamic syntax

var x = ODataDynamic.Expression;
var products = await client
    .For(x.Products)
    .Filter(x.ProductName.Substring(1) == "hai")
    .FindEntriesAsync();
Assert.NotEmpty(products);

Request URI: GET Products?$filter=substring(ProductName%2c1)+eq+%27hai%27


See also:
Retrieving data
OData URI conventions

Clone this wiki locally