c# - 如何在不实现的情况下创建包含 OrderBy 的 IQueryable
问题描述
我有以下代码:
public IOrderedQueryable<T> CreateOrderedList<T>(IQueryable<T> items, string orderByprop, string descProperty)
{
if (!string.IsNullOrEmpty(orderByprop) && !string.IsNullOrEmpty(descProperty))
{
return items.OrderedList(orderByprop, descProperty == "desc");
}
return (IOrderedQueryable<T>)items;
}
public static IOrderedQueryable<T> OrderedList<T>(this IQueryable<T> items, string filterProperty, bool descending = false)
{
var propertyInfo = typeof(T).GetProperty(filterProperty ?? string.Empty, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
if (propertyInfo == null)
{
throw new Exception("Value not found on T");
}
dynamic OrderBy(T o) => propertyInfo.GetValue(o, null);
return (descending ? (IOrderedQueryable<T>)items.OrderByDescending(OrderBy) : (IOrderedQueryable<T>)items.OrderBy(OrderBy));
}
当我尝试执行此操作时,它给了我以下错误:
无法将 System.Linq.OrderedEnumerable`2[Logic.Models.CRM.Project,System.Object] 类型的对象转换为 System.Linq.IOrderedQueryable`1[Logic.Models.CRM.Project] 类型的对象。
但是,我将更多代码链接到查询(数据过滤),因此我需要对象保持 IQueryable,以便查询稍后具体化。我怎样才能实现这个功能?
解决方案
我已经解决了我的问题,只需要做一个小改动:
dynamic OrderBy(T o) => propertyInfo.GetValue(o, null);
本来应该
Expression<Func<T, dynamic>> orderBy = o => propertyInfo.GetValue(o, null);
因为我使用了委托而不是表达式,所以这一定迫使 .NET 实现查询而不是扩展表达式
推荐阅读
- java - 如何在 Java 11 中将 JavaFX 运行时添加到 Eclipse?
- javascript - RxJs:请求的顺序发送并不是真正的顺序
- zoho - Zoho Deluge:如何在电子邮件消息中插入换行符或开始新行?
- database - 删除 neo4j 中所有索引的最佳方法是什么?
- java - Kotlin 文件夹未检测为 Maven Eclipse 中的源文件夹,sts
- javascript - 如何使用 GraphQL 突变减少请求数量?
- php - 如何在 php 循环中添加前缀
- marklogic - 当没有来自查询控制台的请求时,如何有请求率?
- puppet - puppet 仅在更新配置文件时才更新它
- java - 如何定位谷歌地图标记?