首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按lambda表达式动态排序

按lambda表达式动态排序
EN

Stack Overflow用户
提问于 2014-02-06 05:39:37
回答 2查看 3.6K关注 0票数 2

我正在我的应用程序中进行排序,如下所示。

代码语言:javascript
复制
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个字段,)。那么这个方法就会很大

我试着用这样的反射

代码语言:javascript
复制
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);
    }
}

但是失败了。

有什么更好的方法吗?提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-06 05:47:43

最简单的方法是:改变您的方法以接受Expression而不是string

代码语言:javascript
复制
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);
    }
}

你可以称之为:

代码语言:javascript
复制
SelectAll(x => x.LastName, "asc");

或者,如果确实需要它为字符串,则必须使用System.Linq.Expressions.Expression类方法生成表达式树:

代码语言:javascript
复制
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调用上指定泛型类型参数:

代码语言:javascript
复制
var results = SelectAll<int>("Id", "asc");
票数 5
EN

Stack Overflow用户

发布于 2014-02-06 05:45:50

您可以创建用于排序的表达式,如

代码语言:javascript
复制
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);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21594902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档