使用 Linq.Expressions.Expression 排序

2024-01-10

我写了这段代码来排序IQueryable<T>按列sortColumn。我想扩展它,以便具有该列值的条目BirthDate等于DateTime.Today会排在第一位,但我只是找不到或想不出如何完成这项工作。

public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string sortColumn, bool asc)
{
    var param = Expression.Parameter(typeof(T), "p");

    var prop = Expression.Property(param, sortColumn);

    var exp = Expression.Lambda(prop, param);

    string method = asc ? "OrderBy" : "OrderByDescending";

    Type[] types = new[] { q.ElementType, exp.Body.Type };

    var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);

    return q.Provider.CreateQuery<T>(mce);
}

See 使用 LINQ 处理 GridView.OnSorting() 并动态创建排序表达式 http://www.codeproject.com/Articles/246361/Handle-GridView-OnSorting-using-LINQ

public static class SortExpressionBuilder<T>
{
    private static IDictionary<SortDirection, ISortExpression> directions =  new Dictionary<SortDirection, ISortExpression>
    {
        { SortDirection.Ascending, new OrderByAscendingSortExpression() },
        { SortDirection.Descending, new OrderByDescendingSortExpression() }
    };

    interface ISortExpression
    {
        Func<IEnumerable<T>, Func<T, object>, IEnumerable<T>> GetExpression();
    }

    class OrderByAscendingSortExpression : ISortExpression
    {
        public Func<IEnumerable<T>, Func<T, object>, IEnumerable<T>> GetExpression()
        {
            return (c, f) => c.OrderBy(f);
        }
    }

    class OrderByDescendingSortExpression : ISortExpression
    {
        public Func<IEnumerable<T>, Func<T, object>, IEnumerable<T>> GetExpression()
        {
            return (c, f) => c.OrderByDescending(f);
        }
    }

    public static Func<IEnumerable<T>, Func<T, object>, IEnumerable<T>> CreateExpression(SortDirection direction)
    {
        return directions[direction].GetExpression();
    }
}

public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> collection, string columnName, SortDirection direction)
{
    ParameterExpression param = Expression.Parameter(typeof(T), "x"); // x
    Expression property = Expression.Property(param, columnName);     // x.ColumnName
    Func<T, object> func = Expression.Lambda<Func<T, object>>(        // x => x.ColumnName
       Expression.Convert(Expression.Property(param, columnName), 
       typeof(object)), param
    ).Compile();

    Func<IEnumerable<T>, Func<T, object>, IEnumerable<T>> expression = SortExpressionBuilder<T>.CreateExpression(direction);
    IEnumerable<T> sorted = expression(collection, func);
    return sorted;
}

以及底部的链接:

  • 使用 Lambda/Linq to 对象对列表进行排序 https://stackoverflow.com/questions/722868/sorting-a-list-using-lambda-linq-to-objects
  • GridView 排序:SortDirection 始终升序 https://stackoverflow.com/questions/250037/gridview-sorting-sortdirection-always-ascending
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Linq.Expressions.Expression 排序 的相关文章

随机推荐

  • 输入默认图像以防 html 的 src 属性无效?

    有没有办法在 HTML 中呈现默认图像 img 标签 以防万一src属性无效 仅使用 HTML 如果没有 您解决这个问题的轻量级方法是什么 你要求一个仅 HTML解决方案 p p
  • 引导弹出窗口未显示在所有元素的顶部

    我正在开发一个 bootstrap 网站 从 2 0 更新到 bootstrap 2 2 后 除了弹出窗口之外 一切正常 弹出窗口仍然显示良好 但它们不会显示在所有其他元素之上 div this sits on top of the pop
  • 在 GraphQL 中处理 Mongoose 填充的字段

    我如何表示一个可以是简单字段ObjectId字符串还是填充的对象实体 我有一个代表 设备类型 的 Mongoose 架构 如下所示 assetSchema js import as mongoose from mongoose const
  • 创建 png 文件

    我做了一个函数来处理 jpg 和 png 文件 但是在尝试上传 png 文件时出现错误 这是函数 function createImg type src dst width height quality newImage imagecrea
  • C 和 C++ 之间的内存布局兼容性

    我正在建造一个C 使用许多函数的库struct定义在一个C图书馆 为了避免将任何代码移植到 C 我将典型的条件预处理添加到 C 头文件中 例如 my struct h of the C library include
  • Azure 容器注册表保留策略

    我有一个 ACR 它包含适用于我的生产和开发环境的 docker 映像 由于每天都有新的图像被推送 我正在尝试设置保留策略 我的具体用例如下 根据该图像 假设我在 ACR 中有 100 个图像 第 100 个图像由开发环境消耗 然而 生产运
  • C++ 访问向量

    I have std vector其中包含我自己的类 我必须访问它的函数和空隙 class A private int var vector
  • 在 Electron 渲染器进程中读取 Windows 命令行选项

    我在 Windows 中部署了一个 Electron 应用程序 我正在尝试在 exe 上添加命令行选项 C Program Files MyApp exe 调试 如何读取我的应用程序内的调试标志 我尝试使用 process argv 但调试
  • 有没有办法更改领域数据库中的数据类型?

    正如您所看到的图像 我完全搞乱了数据类型 红色圆圈 有没有办法将数据类型更改为整数 EDIT 我想将数据类型从 String 更改为 Int 并且我有现有数据 因此我无法从新领域开始而只更改 var 类型 class Item Object
  • Q_DECLARE_METATYPE 是 boost::multi_array

    我正在尝试使用 Qt 的信号和槽机制传递表示为 boost multi array 的多维数组 我尝试使用以下代码声明元类型 Q DECLARE METATYPE boost multi array
  • MVC 4 SIMpleMembership 与 LDAP

    我想尝试使用 simpleMembership 但将其连接到我们的 LDAP 我在网上没有看到任何关于这样做的内容 只使用 SQL 有谁知道这是否可能并能引导我走向正确的方向 我认为您需要创建一个继承自 ExtendedMembership
  • 结构 - 访问结构元素,不带 .和->

    我需要访问嵌套结构中的一些元素而不使用 and gt 我需要打印出以下值keyValue and alternateKeyValue从测试笔记本电脑定义中不使用 or gt 运算符直接引用 qwerty 结构或其成员 这是结构 typede
  • 如果在接口中声明方法时将注释与方法相关联,我们是否可以强制实现类中存在注释?

    这是关于 Java 中注释的使用 我在接口中声明方法时将注释与方法相关联 在实现时 如何确保该注释与 Override注释一起携带 如果没有 它应该抛出编译错误 Thanks 您不能在编译器中强制执行此操作 不 当在给定类上查找注释时 工具
  • 在 RazorEngine 中使用内部属性

    我们的领域模型属性都是 内部 的 以保护我们所采用的 BDD 方法 我真的很喜欢把一切都内部化 最近 我试图让 RazorEngine 使用这些具有内部成员的域模型之一来处理模板 当它编译时 我收到错误 Attendee FirstName
  • 函数参数类型取决于其他参数的类型

    我正在尝试编写一个具有以下类型签名的函数 范围a是任一类型string or undefined 范围b is a string if a也是一个string 否则它是一个number 到目前为止我的方法如下 function myFunc
  • 对于 .net 开发人员来说,进入移动开发的学习曲线是怎样的?

    对于 net 开发人员来说 进入移动开发的学习曲线是怎样的 有多少种不同的操作系统运行 net windows mobile 和 windows ce 一样吗 学习曲线 我不想说 这取决于 但确实如此 并且取决于几个因素 您的 NET 开发
  • 如何在android中动态添加项目到微调器?

    如何在android中动态添加项目到微调器 Spinner spinner Spinner findViewById R id mySpinner ArrayAdapter
  • 将十六进制字符串转换为十进制整数

    我正在编写一个 Rust 程序 用于读取 I2C 总线并保存数据 当我读取 I2C 总线时 我得到如下十六进制值0x11 0x22 etc 现在 我只能将其作为字符串处理并按原样保存 有没有办法可以将其解析为整数 有没有内置的功能 在大多数
  • 下划线、名称和文字运算符

    我关于名称中下划线的问题得到了部分回答here https stackoverflow com q 12721584 1275653但要么答案不完整 要么我不完全理解 教派 C 11 标准的 2 14 8 7 声明了这一点文字运算符举个例子
  • 使用 Linq.Expressions.Expression 排序

    我写了这段代码来排序IQueryable