I'm new to dotnet core. I'm creating a web api and have implemented the sorting using this link. I have a SortFilter class where I receive the column and order:
public class SortFilter
{
public string sortBy { get; set; } //Column name
public string order { get; set; } //asc or desc
}
Then in the services, I use the provided information to sort the response accordingly:
//Sort
switch (sortFilter.sortBy)
{
case "name_ar":
{
switch (sortFilter.order)
{
case "asc":
{
pagedData = pagedData.OrderBy(s => s.name_ar);
break;
}
case "desc":
{
pagedData = pagedData.OrderByDescending(s => s.name_ar);
break;
}
default:
{
pagedData = pagedData.OrderBy(s => s.name_ar);
break;
}
}
break;
}
case "name_en":
{
switch (sortFilter.order)
{
case "asc":
{
pagedData = pagedData.OrderBy(s => s.name_en);
break;
}
case "desc":
{
pagedData = pagedData.OrderByDescending(s => s.name_en);
break;
}
default:
{
pagedData = pagedData.OrderBy(s => s.name_en);
break;
}
}
break;
}
case "description_ar":
{
switch (sortFilter.order)
{
case "asc":
{
pagedData = pagedData.OrderBy(s => s.description_ar);
break;
}
case "desc":
{
pagedData = pagedData.OrderByDescending(s => s.description_ar);
break;
}
default:
{
pagedData = pagedData.OrderBy(s => s.description_ar);
break;
}
}
break;
}
case "description_en":
{
switch (sortFilter.order)
{
case "asc":
{
pagedData = pagedData.OrderBy(s => s.description_en);
break;
}
case "desc":
{
pagedData = pagedData.OrderByDescending(s => s.description_en);
break;
}
default:
{
pagedData = pagedData.OrderBy(s => s.description_en);
break;
}
}
break;
}
case "orderNumber":
{
switch (sortFilter.order)
{
case "asc":
{
pagedData = pagedData.OrderBy(s => s.orderNumber);
break;
}
case "desc":
{
pagedData = pagedData.OrderByDescending(s => s.orderNumber);
break;
}
default:
{
pagedData = pagedData.OrderBy(s => s.orderNumber);
break;
}
}
break;
}
case "id":
{
switch (sortFilter.order)
{
case "asc":
{
pagedData = pagedData.OrderBy(s => s.id);
break;
}
case "desc":
{
pagedData = pagedData.OrderByDescending(s => s.id);
break;
}
default:
{
pagedData = pagedData.OrderBy(s => s.id);
break;
}
}
break;
}
default:
pagedData = pagedData.OrderBy(s => s.id);
break;
}
What I'm not liking about this approach is this big chunk of code repeating in all the services, specific for each entities' columns.
I tried to create a template Sort Class where I can do something like:
pagedData = pagedData.OrderBy(s => s[sortFilter.sortBy]) //using variable column name
But, this is not allowed. Can anyone suggest me an alternative?