KendoNET.DynamicLinq implements server paging, filtering, sorting, grouping, and aggregating to Kendo UI via Dynamic Linq for .Net Core App(1.x ~ 3.x).
- None
- You must add custom
ObjectToInferredTypesConverter
to yourJsonSerializerOptions
sinceSystem.Text.Json
didn't deserialize inferred type to object properties now, see the sample code and reference.
- Add the KendoNET.DynamicLinq NuGet package to your project.
- Configure your Kendo DataSource to send its options as JSON.
parameterMap: function(options, type) {
return JSON.stringify(options);
}
- Configure the
schema
of the dataSource.
schema: {
data: "Data",
total: "Total",
aggregates: "Aggregates",
groups: "Groups",
errors: "Errors"
}
- The completed code like below.
..... Other kendo grid code .....
dataSource: {
schema:
{
data: "Data",
total: "Total",
aggregates: "Aggregates",
groups: "Groups",
errors: "Errors",
...
},
transport: {
read: {
url: 'your read url',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
type: 'POST'
},
create: {
url: 'your create url',
dataType: "json",
contentType: 'application/json; charset=utf-8',
type: 'POST'
},
parameterMap: function (data, operation) {
return JSON.stringify(data);
}
},
error: function(e) {
console.log(e.errors); // Your error information
e.sender.cancelChanges();
},
pageSize: 20,
serverPaging: true,
serverFiltering: true,
serverSorting: true,
...
}
..... Other kendo grid code .....
- Import the KendoNET.DynamicLinq namespace.
- Use the
ToDataSourceResult
extension method to apply paging, sorting, filtering, grouping and aggregating.
using KendoNET.DynamicLinq
[WebMethod]
public static DataSourceResult Products(int take, int skip, IEnumerable<Sort> sort, Filter filter, IEnumerable<Aggregator> aggregates, IEnumerable<Group> groups)
{
using (var northwind = new Northwind())
{
return northwind.Products
.OrderBy(p => p.ProductID) // EF requires ordering for paging
.Select(p => new ProductViewModel // Use a view model to avoid serializing internal Entity Framework properties as JSON
{
ProductID = p.ProductID,
ProductName = p.ProductName,
UnitPrice = p.UnitPrice,
UnitsInStock = p.UnitsInStock,
Discontinued = p.Discontinued
})
.ToDataSourceResult(take, skip, sort, filter, aggregates, groups);
}
}
or from Kendo UI request
using KendoNET.DynamicLinq
[HttpPost]
public IActionResult Products([FromBody] DataSourceRequest requestModel)
{
using (var northwind = new Northwind())
{
return northwind.Products
.Select(p => new ProductViewModel // Use a view model to avoid serializing internal Entity Framework properties as JSON
{
ProductID = p.ProductID,
ProductName = p.ProductName,
UnitPrice = p.UnitPrice,
UnitsInStock = p.UnitsInStock,
Discontinued = p.Discontinued
})
.ToDataSourceResult(requestModel.Take, requestModel.Skip, requestModel.Sort, requestModel.Filter, requestModel.Aggregate, requestModel.Group);
}
}
When server-side filterable options are enabled and apply a query with filter condition that contains DateTime
type column, then EntityFramework Core would throw an
exception System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting date and/or time from character string
. The error is caused by a known issue in some old EntityFramework
Core versions. The workaround is adding datetime
value to the related column in DbContext. e.g.
public class MyContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
..........
modelBuilder.Entity<Member>().Property(x => x.UpdateTime).HasColumnType("datetime");
..........
}
}
- Open command line console
- Switch to project root directory(src\KendoNET.DynamicLinq).
- Run "dotnet restore"
- Run "dotnet pack --configuration Release"
- Add
<repository type="git" url="https://github.com/linmasaki/KendoNET.DynamicLinq.git" />
to package metadata of nupkg to show repository URL at Nuget
KendoNET.DynamicLinq is a reference to Ali Sarkis's Kendo.DynamicLinq.
The following links are Kendo UI online docs(related to this package) and you can refer to.
More Kendo UI configuration can refer to here