I have created one generic Page class for store paging information with its data.
The class look like:
public class Page<T>
where T : new()
{
private List<T> _list = new List<T>();
[JsonProperty(PropertyName = "total_count")]
public long TotalCount { get; set; }
[JsonProperty(PropertyName = "page_start")]
public long PageStart { get; set; }
[JsonProperty(PropertyName = "page_size")]
public long PageSize { get; set; }
[JsonProperty(PropertyName = "list")]
public List<T> List
{
get { return _list; }
set { _list = value; }
}
}
For every table model of my application uses generic Page class in repository for return PageSize and its total records with its List.
My repository use like below:
public class StudentRepository
{
private readonly CountingCloud_DevContext _dbContext;
public StudentRepository(CountingCloud_DevContext dbContext)
{
_dbContext = dbContext;
}
public Page<StudentResponse> Get(Dictionary<string, object> filterParameters)
{
var resultfinal = new Page<StudentResponse>();
int from = 0, size = 10;
resultfinal = Paging(resultfinal, filterParameters, ref from, ref size);
var query = _dbContext.Students.ToList();
var result = query.Select(x => new StudentResponse
{
Id = x.Id,
Name = x.Name
});
resultfinal.TotalCount = result.Count();
query = result.Skip(from).Take(size);
return resultfinal;
}
private static Page<StudentResponse> Paging(Page<StudentResponse> pagingResponse, Dictionary<string, object> parameters, ref int from, ref int size)
{
if (parameters != null)
{
if (parameters.ContainsKey("PageSize") && parameters.ContainsKey("PageStart"))
{
if (Convert.ToInt32(parameters["PageSize"]) != 0)
{
size = Convert.ToInt32(parameters["PageSize"]);
from = (Convert.ToInt32(parameters["PageStart"]) - 1) * size;
pagingResponse.PageSize = size;
pagingResponse.PageStart = Convert.ToInt32(parameters["PageStart"]);
}
}
else
{
pagingResponse.PageSize = size;
pagingResponse.PageStart = from + 1;
}
}
else
{
pagingResponse.PageSize = size;
pagingResponse.PageStart = from + 1;
}
return pagingResponse;
}
}
Currently Paging() method I have use for all table like my other Repository is for Employee then for that paging method is look like below:
private static Page<EmployeeResponse> Paging(Page<StudentResponse> pagingResponse, Dictionary<string, object> parameters, ref int from, ref int size)
{
if (parameters != null)
{
if (parameters.ContainsKey("PageSize") && parameters.ContainsKey("PageStart"))
{
if (Convert.ToInt32(parameters["PageSize"]) != 0)
{
size = Convert.ToInt32(parameters["PageSize"]);
from = (Convert.ToInt32(parameters["PageStart"]) - 1) * size;
pagingResponse.PageSize = size;
pagingResponse.PageStart = Convert.ToInt32(parameters["PageStart"]);
}
}
else
{
pagingResponse.PageSize = size;
pagingResponse.PageStart = from + 1;
}
}
else
{
pagingResponse.PageSize = size;
pagingResponse.PageStart = from + 1;
}
return pagingResponse;
}
I would like make this private method is generic so all repository use same, please suggest me what I am implemented is correct or any better improvement for code any changes.