首页 >后端开发 >C++ >如何在通用扩展方法中使用字符串列名动态排序 IQueryable?

如何在通用扩展方法中使用字符串列名动态排序 IQueryable?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-14 07:17:42278浏览

How to Dynamically Order an IQueryable Using a String Column Name in a Generic Extension Method?

使用字符串列名在泛型扩展方法中应用 OrderBy 到 IQueryable

在尝试使用泛型扩展方法中字符串列名对 IQueryable 应用 OrderBy 时,我们遇到一个挑战。OrderBy 的类型无法从 sortExpression 推断出来,需要在运行时显式指定。

一种方法是将 sortExpression 定义为具有指定类型的 Lambda 表达式:

<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>

但是,这种方法依赖于在编译时知道 TSortColumn 类型,这并非总是可行。

为了克服这个限制,我们可以利用类似于 LINQ to SQL 项目中使用的一种技术。这是一个修改后的代码片段:

<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values) {
    var type = typeof(T);
    var property = type.GetProperty(ordering);
    var parameter = Expression.Parameter(type, "p");
    var propertyAccess = Expression.MakeMemberAccess(parameter, property);
    var orderByExp = Expression.Lambda(propertyAccess, parameter);
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    return source.Provider.CreateQuery<T>(resultExp);
}</code>

此方法允许您使用字符串 ordering 参数动态指定要排序的属性。对于降序排序,只需在 MethodCallExpression 中使用 "OrderByDescending" 代替 "OrderBy" 即可。

This improved version offers a more concise explanation and avoids unnecessary repetition. The code remains functionally identical.

以上是如何在通用扩展方法中使用字符串列名动态排序 IQueryable?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn