我进入一个项目,需要为EFCore构建一些动态查询,并且需要使这些查询可被不同的属性以及Asc和DESC协调。
在用switch实例实现了一些查询之后,我问自己一个通用的OrderBy函数,该函数可以通过给定的Attribute-Name和给定的SortOrder进行排序。
那么如何实现对IQueryable执行一般orderBy或orderByDesc的功能?
答案 0 :(得分:0)
在我的情况下,我的客户端应用程序是一个Angular项目,该项目将ColumnName(属性名称)作为字符串发送,将SortOrder发送为int(-1 DESC,1 ASC)。
使用以下扩展功能,可以根据属性名称和SortOrder直接对IQueryable排序(可以轻松更改为字符串)。
public static IOrderedQueryable<TSource> ApplyOrderDirection<TSource>(this IQueryable<TSource> source, string attributeName, int sortOrder)
{
if (String.IsNullOrEmpty(attributeName))
{
return source as IOrderedQueryable<TSource>;
}
var propertyInfo = typeof(TSource).GetProperty(attributeName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
if (propertyInfo == null)
{
throw new ArgumentException("ApplyOrderDirection: The associated Attribute to the given AttributeName could not be resolved", attributeName);
}
Expression<Func<TSource, object>> orderExpression = x => propertyInfo.GetValue(x, null);
if (sortOrder > 0)
{
return source.OrderBy(orderExpression);
}
else
{
return source.OrderByDescending(orderExpression);
}
}
花了我一段时间才能使它工作,甚至找到/构建此解决方案。我希望它可以帮助其他人并节省一些时间。