我在我的应用程序中进行排序,如下所示.
public IQueryableSelectAll(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); } } }
它现在很好,但我必须对Users
表中的所有字段(大约30个字段)进行排序.那么方法会很大
我尝试使用这样的反射
public IQueryableSelectAll(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); } }
但是发誓.
有没有更好的方法来做到这一点?提前致谢
最简单的方法:将您的方法更改为接受Expression
而不是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); } }
您可以将其命名为:
SelectAll(x => x.LastName, "asc");
或者如果你真的需要它是字符串,你必须使用System.Linq.Expressions.Expression
类方法生成表达式树:
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); } }
但它需要在SelectAll
调用时指定泛型类型参数:
var results = SelectAll<int>("Id", "asc");