title | description | type | page_title | slug | position | tags | ticketid | res_type |
---|---|---|---|---|---|---|---|---|
Modifying the DataSourceRequest Object to Map ViewModel Objects to EF Core Entities and Support Filtering and Sorting |
Learn how to map the DataSourceRequest members to the corresponding EF core entity. |
how-to |
DataSourceRequest Model Mapping |
datasource_model_mapping |
DataSource, DataSourceRequest, attribute, map, properties, View Model, EF Core entity, SortDescriptor, FilterDescriptor |
1601637 |
kb |
Product Version | 2023.1.117 |
Product | DataSource for {{ site.framework }} |
I want to use Model Mapping, but my view model object and entities returned by Entity Framework are not identical. Thus, when I follow the Model mapping documentation I get an exception.
I have an EF Core entity:
public class Product
{
public long ID {get;set;}
public string Product_Name {get;set;}
}
And a corresponding ViewModel:
public class ProductVM
{
public long Id {get;set;}
public string ProductName {get;set;}
}
A possible approach to resolve the issue is to implement model mapping and map the different model properties to support filtering and sorting. The solution below is suggested by Dave, a member of our forums, and shows how to map model properties so filtering and sorting can be used:
public static class DataSourceRequestExtensions
{
public static void RemapMember(this DataSourceRequest request, string memberName, string newMemberName)
{
foreach (var sort in request.Sorts)
{
if (sort.Member.Equals(memberName))
{
sort.Member = newMemberName;
}
}
foreach (var filter in request.Filters)
{
if (filter is CompositeFilterDescriptor compositeFilterDescriptor)
{
foreach (var compositeFilter in compositeFilterDescriptor.FilterDescriptors)
{
RemapFilterDescription(compositeFilter, memberName, newMemberName);
}
}
RemapFilterDescription(filter, memberName, newMemberName);
}
}
private static void RemapFilterDescription(IFilterDescriptor filter, string memberName, string newMemberName)
{
if (!(filter is FilterDescriptor descriptor)) return;
if (descriptor.Member.Equals(memberName))
{
descriptor.Member = newMemberName;
}
}
}
Use the extension method to map the model properties so filtering and sorting works as expected:
public ActionResult Grid_Read([DataSourceRequest] DataSourceRequest request)
{
var data = myProductsService.GetAllProducts();
request.RemapMember("Id", "ID");
request.RemapMember("ProductName", "Product_Name");
var dsResult = data.ToDataSourceResult(request, model => new ProductVM()
{
Id = model.ID,
ProductName = model.Product_Name
});
return Json(dsResult);
}
-
[{{ site.framework }} DataSource Documentation]({%slug htmlhelpers_datasource_aspnetcore%})
-
[{{ site.framework }} DataSource Demos](https://demos.telerik.com/{{ site.platform }}/datasource/index)
-
[{{ site.framework }} Grid Documentation]({%slug htmlhelpers_grid_aspnetcore_overview%})
-
[{{ site.framework }} Grid Demos](https://demos.telerik.com/{{ site.platform }}/grid/index)
{% if site.core %}
-
[Telerik UI for {{ site.framework }} Video Onboarding Course (Free for trial users and license holders)]({%slug virtualclass_uiforcore%})
{% else %}
-
[Telerik UI for {{ site.framework }} Video Onboarding Course (Free for trial users and license holders)]({%slug virtualclass_uiformvc%})
-
Telerik UI for {{ site.framework }} Forums {% endif %}
- [Server-Side API Reference of the Grid for {{ site.framework }}](https://docs.telerik.com/{{ site.platform }}/api/grid)
- Client-Side API Reference of the Grid for {{ site.framework }}
- [Server-Side API Reference of the DataSource for {{ site.framework }}](https://docs.telerik.com/{{ site.platform }}/api/datasource)
- [Telerik UI for {{ site.framework }} Breaking Changes]({%slug breakingchanges_2023%})
- [Telerik UI for {{ site.framework }} Knowledge Base](https://docs.telerik.com/{{ site.platform }}/knowledge-base)