4

可能重复:
动态 LINQ OrderBy

我有一个自定义排序选项列表,这些选项从客户端网格控件(如果您想知道的话是 KendoUI 网格)传递给服务器。这些排序选项具有作为字符串排序的属性。我编写了一个 switch 方法,它将检查排序对象的值并应用适当的 LINQ。

    private IQueryable<Report> SortReports(IQueryable<Report> reports, KendoSort sort)
    {
        switch (sort.Field)
        {
            case "name":
                return sort.Dir == "asc" ? reports.OrderBy(x => x.Name) : reports.OrderByDescending(x => x.Name);
            case "description":
                return sort.Dir == "asc" ? reports.OrderBy(x => x.Description) : reports.OrderByDescending(x => x.Description);
            default:
                return sort.Dir == "asc" ? reports.OrderBy(x => x.Id) : reports.OrderByDescending(x => x.Id);
        }
    }

这工作正常,但看起来很丑。我如何通过反射来做到这一点,这样我就不必为我想要使用的每种类型的实体编写自定义函数?如果无论实体是什么,我都可以只使用一个函数来执行此操作,那就太好了。

4

4 回答 4

2

您可以使用动态 LINQ。这是blog postScott Gu 的相关内容。

于 2012-10-22T05:47:36.823 回答
1

Marc Gravell 有一个很棒的小库,叫做FastMember。你可以像这样使用它:

private IQueryable<Report> SortReports(IQueryable<Report> reports,KendoSort sort)
{
    var accessor = TypeAccessor.Create(typeof(Report));
    return sort.Dir == "asc" ? 
        reports.OrderBy(x => accessor[x,sort.Field]) : 
        reports.OrderByDescending(x => accessor[x,sort.Field]));
}
于 2012-10-22T05:49:34.157 回答
1

使用反射,其中 KendoSort.Property 是 Report 属性的 PropertyInfo,它返回排序所需的值。

private IQueryable<Report> SortReports(IQueryable<Report> reports, KendoSort sort)
{
    return sort.Dir == "asc" ? reports.OrderBy(x => sort.Property.GetValue(x)) : reports.OrderByDescending(x => sort.Property.GetValue(x));
}

但是,反射相对较慢。其他解决方案可能更好。

于 2012-10-22T06:11:43.033 回答
1

以下应该动态创建您想要的排序功能。

ParameterExpression pe = Expression.Parameter(typeof(Report), "x");
LambdaExpression le = Expression.Lambda(
    Expression.PropertyOrField(pe, sort.Field),
    new List<ParameterExpression>() {pe});

var leCompiled = (Func<Report, string>)le.Compile();                

return sort.Dir == "asc" ? reports.OrderBy(leCompiled) : reports.OrderByDescending(leCompiled);

它以 x => x.ReportProperty 的形式创建一个 Func 委托,其中 ReportProperty 是 sort.Field 的值。

于 2012-10-22T06:13:41.507 回答