The Q2 2010 release of Telerik Reporting introduces two new data source components that are aimed at improving the integration with business applications utilizing the ADO.NET Entity Framework or the OpenAccess ORM.
(You can see the new data source components in action in the free webinar tomorrow, Tuesday , Jul 20, 11 am EST. Just register for What’s New in Telerik Reporting and RadControls for WinForms. During the live event attendees will also have the chance to win a Telerik Ultimate Collection, valued at $1999).
Prior to the Q2 2010 Telerik Reporting release, the only option for connecting a report to an existing entity model was to create a class with a custom business logic responsible for all data retrieval from that entity model, and then use the ObjectDataSource component to data-bind the report to it. However that approach had an inconsistent design-time support at best, and also imposed several limitations at runtime, so it was evident a dedicated solution was necessary.
The Q2 2010 release introduces the new EntityDataSource and OpenAccessDataSource components that can be used to connect reports directly to an existing ADO.NET Entity Data Model or an Open Access Data Model respectively. The offered integration with the ADO.NET Entity Framework and the Open Access ORM is now completely seamless both at design-time and at runtime without the need of extra code. There are several benefits when using the EntityDataSource and OpenAccessDataSource components over the ObjectDataSource component:
Each entity model can be treated as a special type of a business object layer generated by the ORM tool. In this regard the EntityDataSource and the OpenAccessDataSource components are similar to the ObjectDataSource component. For example, the following code snippet uses the EntityDataSource component to connect a report to an existing ADO.NET Entity Data Model:
C#:
var entityDataSource =
new
EntityDataSource();
entityDataSource.ObjectContext =
typeof
(MyContext);
entityDataSource.ObjectContextMember =
"MyEntities"
;
var report =
new
Report();
report.DataSource = entityDataSource;
VB.NET:
Dim
entityDataSource =
New
EntityDataSource()
entityDataSource.ObjectContext =
GetType
(MyContext)
entityDataSource.ObjectContextMember =
"MyEntities"
Dim
report =
New
Report()
report.DataSource = entityDataSource
Assign the type of the desired object context to the ObjectContext property of the data source, and the name of the property or method responsible for data retrieval to the ObjectContextMember property. At runtime, the data source component creates a new instance of the given object context, and invokes the specified member to obtain the entities needed by the report. The object context instance is kept alive for the duration of the report generation process and then destroyed automatically, when it is no longer needed by the reporting engine.
Here is a similar code snippet that uses the OpenAccessDataSource component to connect a report to an existing Open Access Data Model:
C#:
var openAccessDataSource =
new
OpenAccessDataSource();
openAccessDataSource.ObjectContext =
typeof
(MyContext);
openAccessDataSource.ObjectContextMember =
"MyEntities"
;
var report =
new
Report();
report.DataSource = openAccessDataSource;
VB.NET:
Dim
openAccessDataSource =
New
OpenAccessDataSource()
openAccessDataSource.ObjectContext =
GetType
(MyContext)
openAccessDataSource.ObjectContextMember =
"MyEntities"
Dim
report =
New
Report()
report.DataSource = openAccessDataSource
Both the EntityDatasource and the OpenAccessDataSource components offer a great deal of flexibility when connecting to an entity model. For example, let us extend the previous object context using a partial class that defines a method with custom business logic:
C#:
public
partial
class
MyContext
{
public
List<MyEntity> GetMyEntities(
string
name,
int
value)
{
return
this
.MyEntities.Where(entity => entity.Name == name && entity.Value == value).ToList();
}
}
VB.NET:
Partial
Public
Class
MyContext
Public
Function
GetMyEntities(
ByVal
name
As
String
,
ByVal
value
As
Integer
)
As
List(Of MyEntity)
Return
Me
.MyEntities.Where(
Function
(entity) entity.Name = name
And
entity.Value = value).ToList()
End
Function
End
Class
As usual, specify the type of the object context to the ObjectContext property, and the name of the method to the ObjectContextMember property. Additionally, if the method has any arguments, you can pass data source parameters automatically to them using the Parameters collection. The sample code below illustrates how to do this with the EntityDataSource component:
C#:
var entityDataSource =
new
EntityDataSource();
entityDataSource.ObjectContext =
typeof
(MyContext);
entityDataSource.ObjectContextMember =
"GetMyEntities"
;
entityDataSource.Parameters.Add(
"name"
,
typeof
(
string
),
"=Parameters.Name.Value"
);
entityDataSource.Parameters.Add(
"value"
,
typeof
(
int
),
"=Parameters.Value.Value"
);
var report =
new
Report();
report.DataSource = entityDataSource;
report.ReportParameters.Add(
"Name"
, ReportParameterType.String,
"MyName"
);
report.ReportParameters.Add(
"Value"
, ReportParameterType.Integer, 100);
VB.NET:
Dim
entityDataSource =
New
EntityDataSource()
entityDataSource.ObjectContext =
GetType
(MyContext)
entityDataSource.ObjectContextMember =
"GetMyEntities"
entityDataSource.Parameters.Add(
"name"
,
GetType
(
String
),
"=Parameters.Name.Value"
)
entityDataSource.Parameters.Add(
"value"
,
GetType
(
Integer
),
"=Parameters.Value.Value"
)
Dim
report =
New
Report()
report.DataSource = entityDataSource
report.ReportParameters.Add(
"name"
, ReportParameterType.
String
,
"MyName"
)
report.ReportParameters.Add(
"value"
, ReportParameterType.
Integer
, 100)
Here is the corresponding code snippet for the OpenAccessDataSource component:
C#:
var openAccessDataSource =
new
OpenAccessDataSource();
openAccessDataSource.ObjectContext =
typeof
(MyContext);
openAccessDataSource.ObjectContextMember =
"GetMyEntities"
;
openAccessDataSource.Parameters.Add(
"name"
,
typeof
(
string
),
"=Parameters.Name.Value"
);
openAccessDataSource.Parameters.Add(
"value"
,
typeof
(
int
),
"=Parameters.Value.Value"
);
var report =
new
Report();
report.DataSource = openAccessDataSource;
report.ReportParameters.Add(
"Name"
, ReportParameterType.String,
"MyName"
);
report.ReportParameters.Add(
"Value"
, ReportParameterType.Integer, 100);
VB.NET:
Dim
openAccessDataSource =
New
OpenAccessDataSource()
openAccessDataSource.ObjectContext =
GetType
(MyContext)
openAccessDataSource.ObjectContextMember =
"GetMyEntities"
openAccessDataSource.Parameters.Add(
"name"
,
GetType
(
String
),
"=Parameters.Name.Value"
)
openAccessDataSource.Parameters.Add(
"value"
,
GetType
(
Integer
),
"=Parameters.Value.Value"
)
Dim
report =
New
Report()
report.DataSource = openAccessDataSource
report.ReportParameters.Add(
"name"
, ReportParameterType.
String
,
"MyName"
)
report.ReportParameters.Add(
"value"
, ReportParameterType.
Integer
, 100)
If you need more information in this regard you can visit the following help topics from our online documentation:
If you are interested to see the other new Q2 features of Telerik Reporting, just register for the free webinar this Tuesday, Jul 20, 11 am EST and check out What’s New in Telerik Reporting and RadControls for WinForms. During the live event attendees will also have the chance to win a Telerik Ultimate Collection (valued at $1999).
Stefan’s main interests outside the .NET domain include rock music, playing the guitar and swimming.