使用字符串列名在泛型扩展方法中应用 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中文网其他相关文章!