This post is part 7 of the Web API and OData V4 series. This article demonstrates how to use an OData singleton with Web API. The singleton class has a list of child entities which is used to select contained entities from the SQLite database.
Part 1 Getting started with Web API and OData V4 Part 1.
Part 2 Web API and OData V4 Queries, Functions and Attribute Routing Part 2
Part 3 Web API and OData V4 CRUD and Actions Part 3
Part 4 Web API OData V4 Using enum with Functions and Entities Part 4
Part 5 Web API OData V4 Using Unity IoC, SQLite with EF6 and OData Model Aliasing Part 5
Part 6 Web API OData V4 Using Contained Models Part 6
Part 7 Web API OData V4 Using a Singleton Part 7
Part 8 Web API OData V4 Using an OData T4 generated client Part 8
Part 9 Web API OData V4 Caching Part 9
Part 10 Web API OData V4 Batching Part 10
Part 11 Web API OData V4 Keys, Composite Keys and Functions Part 11
Code: https://github.com/damienbod/WebAPIODataV4SQLite
The singleton entity is defined as follows:
using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Web.OData.Builder; namespace WebAPIODataV4SQLite.DomainModel { public class SkillLevels { [Key] public int Id { get; set; } [Contained] public List<SkillLevel> Levels { get; set; } } public class SkillLevel { [Key] public int Level { get; set; } public string Description { get; set; } [Contained] public virtual PlayerStats PlayerStats { get; set; } } }
The SkillLevels will be the OData singleton. This entity has a list of contained SkillLevel entities. The SkillLevel entity has a Contained PlayerStats list which is selected from the database.
Now the OData singleton can be defined in the model:
SingletonConfiguration<SkillLevels> skillLevels = builder.Singleton<SkillLevels>("SkillLevels"); builder.EntityType<SkillLevel>();
The OData model can then be made accessible using an ODataController. The SkillLevelsController makes it possible to select the singleton or the child Levels or the PlayerStats pro level:
using System.Collections.Generic; using System.Linq; using System.Web.Http; using System.Web.OData; using System.Web.OData.Query; using System.Web.OData.Routing; using WebAPIODataV4SQLite.DomainModel; namespace WebAPIODataV4SQLite.Controllers { public class SkillLevelsController : ODataController { private readonly SqliteContext _sqliteContext; public SkillLevelsController(SqliteContext sqliteContext) { _sqliteContext = sqliteContext; } [EnableQuery(PageSize = 20)] public IHttpActionResult Get() { return Ok(GetFixedSkillLevels()); } [EnableQuery(PageSize = 20)] [ODataRoute("SkillLevels/Levels({key})")] public IHttpActionResult GetPlayerStats([FromODataUri] int key) { return Ok(GetFixedSkillLevels().Levels.FirstOrDefault(t => t.Level == key)); } [EnableQuery(PageSize = 20, AllowedQueryOptions = AllowedQueryOptions.All)] [HttpGet] [ODataRoute("SkillLevels/Levels({key})/PlayerStats")] public IHttpActionResult GetPlayserStats([FromODataUri] int key) { return Ok(_sqliteContext.PlayerStatsEntities.Where(t => t.SkillLevel == key)); } private SkillLevels GetFixedSkillLevels() { return new SkillLevels { Id =1, Levels = new List<SkillLevel> { new SkillLevel {Description = "Legend", Level = 1}, new SkillLevel {Description = "Master", Level = 2}, new SkillLevel {Description = "Senior", Level = 3}, new SkillLevel {Description = "Intermediate", Level = 4}, new SkillLevel {Description = "Junior", Level = 5}, new SkillLevel {Description = "Novice", Level = 6} } }; } } }
Now the application can be tested:
http://localhost:59145/odata/SkillLevels or http://localhost:59145/odata/SkillLevels?$expand=Levels
http://localhost:59145/odata/SkillLevels/Levels(2) http://localhost:59145/odata/SkillLevels/Levels(2)/PlayerStats
If you want to check or view the metadata, you can query as follows:
http://localhost:59145/odata/SkillLevels?$format=application/json;odata.metadata=full http://localhost:59145/odata/SkillLevels/Levels(2)?$format=application/json;odata.metadata=full
Web API OData V4 makes it very easy to use or implement OData singleton models. This can be mapped, referenced like EntitySets or Collections of EntitySets.
Links:
http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/
http://blogs.msdn.com/b/odatateam/archive/2014/03/13/containment-is-coming-with-odata-v4.aspx
http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-22#OData
Hi Thanks for putting my site on your blog.
No problem, thanks for your blog
Greetings Damien
Reblogged this on Dinesh Ram Kali..