使用Expression构建器排序

时间:2015-06-10 03:24:45

标签: entity-framework expression

我正在尝试使用Expressions构建泛型排序方法。 我提出了以下方法。由于某些原因,当在排序表达式中使用嵌套属性时,代码在语句处断开。

MongoError: server localhost:27017 received an error {"name":"MongoError","message":"read ECONNRESET"}

知道我做错了吗?

1 个答案:

答案 0 :(得分:0)

尝试:

private static readonly MethodInfo OrderBy = (from x in typeof(Queryable).GetMethods()
                                              where x.Name == "OrderBy"
                                              let pars = x.GetParameters()
                                              where pars.Length == 2
                                              select x).Single();

private static IQueryable<T> SortQuery<T>(IQueryable<T> query, string sortColumn)
{
    if (!string.IsNullOrEmpty(sortColumn))
    {
        var sortParam = Expression.Parameter(typeof(T), "x");

        Expression expr = sortParam;

        foreach (var prop in sortColumn.Split('.'))
        {
            expr = Expression.PropertyOrField(expr, prop);
        }

        var lambda = Expression.Lambda(expr, sortParam);

        var orderBy = OrderBy.MakeGenericMethod(typeof(T), expr.Type);

        return (IQueryable<T>)orderBy.Invoke(null, new object[] { query, lambda });
    }

    return null;
}

您必须使用反射来调用Queryable.OrderBy。一般来说,转换为object对于Entity Framework / LINQ to SQL不能很好地工作,所以你可以尝试一下,但它的工作机会很小。