我正在我的应用程序中进行排序,如下所示。
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);
}
}
}现在可以了,但是我必须对Users表中的所有字段进行排序(,大约30个字段,)。那么这个方法就会很大
我试着用这样的反射
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);
}
}但是失败了。
有什么更好的方法吗?提前感谢
发布于 2014-02-06 05:47:43
最简单的方法是:改变您的方法以接受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");发布于 2014-02-06 05:45:50
您可以创建用于排序的表达式,如
public IQueryable<Users> SelectAllByCompany(string sSortExpression, string sSortOrder)
{
var p = Expression.Parameter(typeof(Users),"u");
var sortExpr = Expression.Lambda<Func<User,object>>(Expresion.Property(p,sSortExpression), p);
if (sSortOrder == "asc")
{
return UsersRepository.Entities.OrderBy(sortExpr);
}
else
{
return UsersRepository.Entities.OrderByDescending(sortExpr);
}
}https://stackoverflow.com/questions/21594902
复制相似问题