Skip to content

Latest commit

 

History

History
141 lines (113 loc) · 5.08 KB

datasource-model-mapping.md

File metadata and controls

141 lines (113 loc) · 5.08 KB
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

Environment

Product Version 2023.1.117
Product DataSource for {{ site.framework }}

Description

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;}
}

Solution

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);
        }

More {{ site.framework }} Grid and DataSource Resources

  • [{{ 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 %}

{% else %}

See Also