c# - C# 表达式按关键字段对通用查询进行排序
问题描述
我有一个通用方法,我想IQueryable<T>
按其键字段对它进行排序(可以安全地假设只有一个)。因此:
void DoStuff<T>(...)
{
IQueryable<T> queryable = ... // given
PropertyInfo keyField = ... // given
var sortedQueryable = queryable.OrderBy(<some expression here>);
...
}
如何定义一个Expression
将返回的keyField
属性,T
以便它可以工作?
解决方案
这并不太难,但是您需要调用OrderBy
with 反射,因为您提前不知道键字段的类型。因此,鉴于您已经显示的代码,您将执行以下操作:
// Build up the property expression to pass into the OrderBy method
var parameterExp = Expression.Parameter(typeof(T), "x");
var propertyExp = Expression.Property(parameterExp, keyField);
var orderByExp = Expression.Lambda(propertyExp, parameterExp);
// Note here you can output "orderByExp.ToString()" which will give you this:
// x => x.NameOfProperty
// Now call the OrderBy via reflection, you can decide here if you want
// "OrderBy" or "OrderByDescending"
var orderByMethodGeneric = typeof(Queryable)
.GetMethods()
.Single(mi => mi.Name == "OrderBy" && mi.GetParameters().Length == 2);
var orderByMethod = orderByMethodGeneric.MakeGenericMethod(typeof(T), propertyExp.Type);
// Get the result
var sortedQueryable = (IQueryable<T>)orderByMethod
.Invoke(null, new object[] { queryable, orderByExp });
推荐阅读
- python - 通过余弦相似度、TF-IDF 和 pyspark 在 Python 中匹配公司名称
- mongodb - 索引字段如何影响 MongoDB 中没有索引字段的文档的排序顺序?
- service-accounts - 默认情况下,我的 pod 运行的是哪个服务帐户?
- python - 如何在用户踢/禁止的审核日志中添加原因?
- bash - 在 bash 脚本中写入命令输出返回一个空文件
- xen - EDK 2 中 UEFI 引导服务的实际代码在哪里,或者在 EDK 2 源代码中填充系统表的位置在哪里
- angular - 无法从 Angular 向 Spring REST 控制器进行 REST API 调用
- python - 如何使用python将每个循环保存到一个新文件中
- python - n条DNA链有多少种排列方式
- python - 从日志文件中的行中提取逗号分隔值 - python