如何为EF Core建立通用的Order By函数?

时间:2018-11-30 12:13:10

标签: c# ef-core-2.1

我进入一个项目,需要为EFCore构建一些动态查询,并且需要使这些查询可被不同的属性以及Asc和DESC协调。

在用switch实例实现了一些查询之后,我问自己一个通用的OrderBy函数,该函数可以通过给定的Attribute-Name和给定的SortOrder进行排序。

那么如何实现对IQueryable执行一般orderBy或orderByDesc的功能?

1 个答案:

答案 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);
    }
}

花了我一段时间才能使它工作,甚至找到/构建此解决方案。我希望它可以帮助其他人并节省一些时间。