按lambda表达式动态排序

 想翻身的咸鱼。。。 发布于 2023-01-29 09:17

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

public IQueryable 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 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);
    }
}

但是发誓.

有没有更好的方法来做到这一点?提前致谢

1 个回答
  • 最简单的方法:将您的方法更改为接受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");
    

    2023-01-29 09:23 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有