Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Using C#, MVC, WebAPI, OData, Entity Framework, DI/IoC, and Kendo UI MVC and Efficient Data Retrieval

0.00/5 (No votes)
13 Aug 2013 1  
WebAPI, OData, Entity Framework (EF DB First), MVC

Introduction 

The background for this quick article is based on how to properly pass along OData query parameters through to Entity Framework.

To setup your Entity Framework Database First project, I recommend familiarizing yourself with the content in the following links:

Once you have your Entity Framework project created, in an MVC project, you can create the following controller action method to access data using OData.

Next you need to install the following into your MVC project through Nuget:

Once these have been installed, I suggest reviewing OData Using C#, MVC, WebAPI, Entity Framework, Dependency Injection (DI)/Inversion of Control (IoC) and Kendo UI.  

Direct Entity Framework Access with OData 

If you wish to pass along OData query options for Entity Framework to process (recommended), the following code will allow you to do this:

/// <summary>
/// Example of using the EF db context directly
/// 
/// Since we want manual control over applying query options
///   it is not recommended to use the QueryableAttribute:
///     [Queryable(AllowedQueryOptions = AllowedQueryOptions.All, PageSize = 10)]
/// 
/// This will apply the query a second time - to the output - not what we want.
/// 
/// Use this option if not applying the query options - using options.ApplyTo(...)
/// </summary>
/// <param name="options"></param>
/// <returns></returns>
public IEnumerable<USER> Get(ODataQueryOptions<USER> options)
{
    var dbContext = new ATMS.DAL.AtmsContext();
    var ret = options.ApplyTo(dbContext.USERS).Cast<USER>().ToArray();
    // applies filtering options

    //var ret = dbContext.USERS.ToArray(); 
    // returns all records, filtered results to client

    //var ret = options.ApplyTo(dbContext.USERS).Cast<USER>() as IQueryable<USER>;        

    return ret;
}

Note that we are returning IEnumerable and not IQueryable.

Take note, that when using a DI/IoC container, code refactoring has to be done to your Entity Framework project.  Details discussed in the link above.  

Points of Interest

Just because you see a filtered data set on the client, doesn't mean that the entire transport process has been efficient.  You need to ensure that you are returning the optimal amount of data from your database, rather than large inflated data sets and filtering later.  There are a few "gotcha's" that this article identifies.

For a more detailed way of accomplishing this and how to refactor your Entity Framework project for access through a generic repository, see: OData Using C#, MVC, WebAPI, Entity Framework, Dependency Injection (DI)/Inversion of Control (IoC) and Kendo UI.     

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here