I m doing sorting in my application as shown below .
public IQueryable<Users> SelectAll(string sSortExpression, string sSortOrder)
{
if (sSortOrder == "asc")
{
switch (sSortExpression)
{
case "FirstName":
return UsersRepository.Entities.OrderBy(x => x.FirstName);
case "LastName":
return UsersRepository.Entities.OrderBy(x => x.LastName);
default:
return UsersRepository.Entities.OrderBy(x => x.Id);
}
}
else
{
switch (sSortExpression)
{
case "FirstName":
return UsersRepository.Entities.OrderByDescending(x => x.FirstName);
case "LastName":
return UsersRepository.Entities.OrderByDescending(x => x.LastName);
default:
return UsersRepository.Entities.OrderByDescending(x => x.UserName);
}
}
}
Its fine now , but I have to sort on all fields in Users table (Around 30 fields ) .
Then the method will be very big
I tried using reflections like this
public IQueryable<Users> SelectAll(string sSortExpression, string sSortOrder)
{
var _property = UsersRepository.GetType().GetProperties().Where(a => a.Name == sSortExpression);
if (sSortOrder == "asc")
{
return UsersRepository.Entities.OrderBy(x => _property);
}
else
{
return UsersRepository.Entities.OrderByDescending(x => _property);
}
}
But faild.
Is there any better way to do this ? Thanks in advance
The easiest way to go: change your method to accept Expression instead of string:
public IQueryable<Users> SelectAll<TProp>(Expression<Func<Users, TProp>> selector, string sSortOrder)
{
if (sSortOrder == "asc")
{
return UsersRepository.Entities.OrderBy(selector);
}
else
{
return UsersRepository.Entities.OrderByDescending(selector);
}
}
You can call it as:
SelectAll(x => x.LastName, "asc");
Or if you really need it to be string, you have to generate Expression Tree using System.Linq.Expressions.Expression class method:
public IQueryable<Users> SelectAll<TProp>(string sSortExpression, string sSortOrder)
{
var param = Expression.Parameter(typeof(Users));
var propExpression = Expression.Lambda<Func<Users, TProp>>(Expression.Property(param, sSortExpression), param);
if (sSortOrder == "asc")
{
return UsersRepository.Entities.OrderBy(propExpression);
}
else
{
return UsersRepository.Entities.OrderByDescending(propExpression);
}
}
But it will require to specify generic type parameter on SelectAll call:
var results = SelectAll<int>("Id", "asc");
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With