Object data source and entity framework

If we wont to use a business rules layer in our application and expose some business methods to retrive our data, there are some problem using asp.net entity framework components like EntityDataSource. This can be useful to build our MES application and is one of the tecnique used by Mdf - MES Development Framework.

The EntityDataSource allow to retrive data from the model but not from a stored procedure or a business methods so we can use the ObjectDataSource to call our custom methods.

Here there is a little scenario:

  • A business layer have the model MdfEntities
  • There is a partial class that extend the Equipment entity of MdfEntities
  • The user interface is an ASP.NET web page with a DataGrid with paging and sorting

The main problem is paging and sorting data with LINQ framework so to do this I wrote five methods in my business rule class (Equipment in my example).

In this example I retrive the data filtering by a column field that is EquipmenClassID. Obviously this is not the goal of a business rule but can be used to show this technique.

Here there are the five methods:

  • GetEquipmentsByEquipmentClassID
    (string equipmenClassID)
  • GetEquipmentsByEquipmentClassID
    (MdfEntities mdfEntities, string equipmentClassID)
  • GetEquipmentsByEquipmentClassID
    (string sortExpression, string equipmentClassID)
  • GetEquipmentsByEquipmentClassID
    (string sortExpression, int maximumRows,
    int startRowIndex, string equipmentClassID)
  • CountByEquipmentClassID(string equipmenClassID)

In this way I can use the ObjectDataSource into the user inteface:

<asp:GridView ID="entityGridView"

runat="server"

DataSourceID="objectDataSource"

AllowSorting="True"

AllowPaging="True"

PageSize="3"

AutoGenerateColumns="False">

<Columns>

<asp:BoundField DataField="EquipmentID"

HeaderText="EquipmentID"

SortExpression="EquipmentID" />

<asp:BoundField DataField="Description"

HeaderText="Description"

SortExpression="Description" />

<asp:BoundField DataField="EquipmentClassID"

HeaderText="EquipmentClassID"

SortExpression="EquipmentClassID" />

</Columns>

</asp:GridView>

 

<asp:ObjectDataSource ID="objectDataSource"

runat="server"

TypeName="TestMdf.Equipment"

SelectMethod="GetEquipmentsByEquipmentClassID"

 

EnablePaging="True"

SelectCountMethod="CountEquipmentsByEquipmentClassID"

SortParameterName="sortExpression"

 

>

<SelectParameters>

<asp:QueryStringParameter DefaultValue="Filler" Name="equipmentClassID"

QueryStringField="EquipmentClassID" Type="String" />

</SelectParameters>

</asp:ObjectDataSource>

As you can see I need to configure EnablePaging, SelectCountMethod, and SortParameterName attributes of the ObjectDataSource.

Here there is the code of the five methods:

1public IQueryable<Equipment> GetEquipmentsByEquipmentClassID
2    (string equipmentClassID)
3{
4    MdfEntities mdfEntities = new MdfEntities();
5    return GetEquipmentsByEquipmentClassID(mdfEntities, equipmentClassID);
6}
7
8public IQueryable<Equipment> GetEquipmentsByEquipmentClassID
9    (MdfEntities mdfEntities, string equipmentClassID)
10{
11    var result = from entity in mdfEntities.Equipments
12                 where entity.EquipmentClassID == equipmentClassID
13                 select entity;
14
15    return result;
16}
17
18public IQueryable<Equipment> GetEquipmentsByEquipmentClassID
19    (string sortExpression, string equipmentClassID)
20{
21    MdfEntities mdfEntities = new MdfEntities();
22    var result = from entity in mdfEntities.Equipments
23                 where entity.EquipmentClassID == equipmentClassID
24                 select entity;
25
26    if (sortExpression == "")
27    {
28        sortExpression = "EquipmentID";
29    }
30
31    var parameter = Expression.Parameter(typeof(Equipment), "equipment");
32
33    if (sortExpression.IndexOf(" DESC") < 0)
34    {
35        return result.OrderBy(
36            Expression.Lambda<Func<Equipment, object>>(
37                Expression.Property(parameter, sortExpression), 
38                parameter));
39    }
40    else
41    {
42        sortExpression = sortExpression.Replace(" DESC""");
43        return result.OrderByDescending(
44            Expression.Lambda<Func<Equipment, object>>(
45            Expression.Property(parameter, sortExpression), 
46            parameter));
47    }
48}
49
50public IQueryable<Equipment> GetEquipmentsByEquipmentClassID
51    (string sortExpression, int maximumRows, 
52    int startRowIndex, string equipmentClassID)
53{
54    if ((maximumRows > 0) && (startRowIndex > 0))
55    {
56        return GetEquipmentsByEquipmentClassID(sortExpression, 
57            equipmentClassID).Skip(startRowIndex).Take(maximumRows);
58    }
59    else if (startRowIndex > 0)
60    {
61        return GetEquipmentsByEquipmentClassID(sortExpression, 
62            equipmentClassID).Skip(startRowIndex);
63    }
64    else if (maximumRows > 0)
65    {
66        return GetEquipmentsByEquipmentClassID(sortExpression, 
67            equipmentClassID).Take(maximumRows);
68    }
69    else
70    {
71        return GetEquipmentsByEquipmentClassID(sortExpression, 
72            equipmentClassID);
73    }
74}
75
76public int CountEquipmentsByEquipmentClassID(string equipmentClassID)
77{
78    MdfEntities mdfEntities = new MdfEntities();
79    var result = from entity in mdfEntities.Equipments
80                 where entity.EquipmentClassID == equipmentClassID
81                 select entity;
82
83    return result.Count();
84}

To have a more simple solution you can write only the two methods: one for get with all the parameters and one for counting.

 

Mdf - Mes development framework

Mdf - Mes development framework

Mdf - MES Development Framework has been defined from experienced developers to respond to both customers and developers needs.

Write complex Manufacturing Execution Systems fully ISA-95 compliant will never be easier using c# or VB.NET with LINQ to Entity technology, SQL Server 2005/2008 as storage layer, ASP.NET 3.5 with extensive use of Ajax and ASP.NET MVC for user interface, OPC to communicate with PLCs and field devices and Windows Workflow Foundation for plant business rules.

Download the Mdf latest version here.

Mdf Demo