Methods
ToShiftGridAsync | ToShiftGrid¶
The Grid can be initialized by calling the ToShiftGridAsync or ToShiftGrid extension methods on an IQueryable
var shiftGridAsync = await db.Employees.ToShiftGridAsync("ID");
var shiftGrid = db.Employees.ToShiftGrid("ID");
Parameters:
| Parameter | Description |
|---|---|
stableSortField |
String The unique field in the dataset for sorting the result. More about Stable Sorting |
stableSortDirection |
SortDirection The sort direction for the Stable Sorting. Defaults to Ascending |
gridConfig |
GridConfig This is how the grid is controlled. Page Size, Page Index, Filters, Sorting ...etc |
SelectAggregate¶
Used for Aggregating data.
The Aggregation works on the entire data set (Not the paginated Data.). And all the aggregation is performed from the Database side.
[HttpPost("aggregate")]
public async Task<ActionResult> Aggregate([FromBody] GridConfig gridConfig)
{
var db = new DB();
var DbF = Microsoft.EntityFrameworkCore.EF.Functions;
var shiftGrid =
await db
.Employees
.Select(x => new
{
x.ID,
x.FirstName,
x.Birthdate
})
.SelectAggregate(x => new
{
Count = x.Count(),
OldestEmployeeBirthdate = x.Min(y => y.Birthdate),
YoungestEmployeeBirthdate = x.Max(y => y.Birthdate),
NumberOfEmployeesBetween30And40 = x.Count(y => DbF.DateDiffYear(y.Birthdate, DateTime.Now) >= 30 && DbF.DateDiffYear(y.Birthdate, DateTime.Now) <= 40)
})
.ToShiftGridAsync("ID", SortDirection.Ascending, gridConfig);
return Ok(shiftGrid);
}
Tip
When aggregating. It's very important to Include the total count of the data. Something like Count = x.Count().
If you do this. We'll use your Count as the DataCount for the Grid.
This means there'll be 2 Database calls. One for getting the paginated data. And one for getting the aggrecated data.
If you don't Include the Count. We'll add another database call for getting the Count. And you'll have 3 Database calls instead of 2.
Danger
If you do include the Count. Make sure you do a full count and not a conditional count. If you something like below for example, the Grid will use your count as the DataCount leaving you with unexpected behaviour.
.SelectAggregate(x => new
{
//This is very dangerous
Count = x.Count(y=> y.ID > 10),
}
Do below instead
.SelectAggregate(x => new
{
//This is safe and recommended
Count = x.Count(),
}
ToCSVStream¶
When the Export flag on ExportConfig is set to true. This method ToCSVStream() can be used to export the entire data (Unpaginated) to a stream.
Here's an example:
[HttpGet("export")]
public async Task<ActionResult> Export()
{
var db = new DB();
var DbF = Microsoft.EntityFrameworkCore.EF.Functions;
var shiftGrid =
await db
.Employees
.Select(x => new EmployeeCSV
{
ID = x.ID,
FullName = x.FirstName + " " + x.LastName,
Age = DbF.DateDiffYear(x.Birthdate, DateTime.Now)
})
.ToShiftGridAsync("ID", SortDirection.Ascending, new GridConfig
{
ExportConfig = new ExportConfig
{
Export = true,
}
});
var stream = shiftGrid.ToCSVStream();
return File(stream.ToArray(), "text/csv");
}
ToCSVString¶
Identical to ToCSVStream. But this will export the data to a String instead of a Stream.
Here's an example for that. Note the Delimiter is changed to | in this example.
[HttpGet("export-string")]
public async Task<ActionResult> ExportString()
{
var db = new DB();
var DbF = Microsoft.EntityFrameworkCore.EF.Functions;
var shiftGrid =
await db
.Employees
.Select(x => new EmployeeCSV
{
ID = x.ID,
FullName = x.FirstName + " " + x.LastName,
Age = DbF.DateDiffYear(x.Birthdate, DateTime.Now)
})
.ToShiftGridAsync("ID", SortDirection.Ascending, new GridConfig
{
ExportConfig = new ExportConfig
{
Export = true,
Delimiter = "|"
}
});
var csvString = shiftGrid.ToCSVString();
return Ok(csvString);
}
Note
We're using the FileHelpers for exporting data to CSV.
In the above example we're using a class named EmployeeCSV. Note how the class and the fields are decorated by custom attributes from `FileHelpers.
[FileHelpers.DelimitedRecord(",")]
public class EmployeeCSV
{
[FileHelpers.FieldCaption("Employee ID")]
public long ID { get; set; }
[FileHelpers.FieldCaption("Full Name")]
public string FullName { get; set; }
[FileHelpers.FieldCaption("Age")]
public int? Age { get; set; }
}