【问题标题】:OrderBy extension method for NPoco.LinqNPoco.Linq 的 OrderBy 扩展方法
【发布时间】:2018-07-05 00:53:23
【问题描述】:

我想使用 OrderBy("columnName")。

我发现可以通过编写扩展方法或使用反射来实现。

我正在使用 NPoco,我无法编写扩展方法。

IQueryProvider<Sample> query =  DbConnection.Query<Sample>();

我想做:

var res = query.OrderByField("columnName");

我想用类似这样的东西:

public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string SortField, bool Ascending)
{
    var param = Expression.Parameter(typeof(T), "p");
    var prop = Expression.Property(param, SortField);
    var exp = Expression.Lambda(prop, param);
    string method = Ascending ? "OrderBy" : "OrderByDescending";
    Type[] types = new Type[] { q.ElementType, exp.Body.Type };
    var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
}

上述方法不起作用,因为我传递的是 IQueryProvider 而不是 IQueryable。

【问题讨论】:

    标签: c# linq npoco


    【解决方案1】:

    试试下面的代码

    public static IQueryProvider<T> OrderByField<T>(this IQueryProvider<T> q, string SortField, bool Ascending)
    {
        var param = Expression.Parameter(typeof(T), "p");
        var prop = Expression.Property(param, SortField);
        string methodName = Ascending ? "OrderBy" : "OrderByDescending";
        Expression conversion = Expression.Convert(prop, typeof(object));
        LambdaExpression lambda = Expression.Lambda(conversion, param);
        object result = typeof(IQueryProvider<T>).GetMethods().Single(
                method => method.Name == methodName)
            .Invoke(q, new object[] { lambda });
        return (IQueryProvider<T>)result;
    }
    

    然后应用查询。

    var list = db.Query<Users>().OrderByField("Id",false).ToList();
    

    【讨论】:

    • 我得到“方法的类型参数不能从用法中推断出来。尝试明确指定类型参数”。
    • 您愿意分享您的查询吗?
    • DbConnection.Query().OrderByField("Id", false).ToList();我也试过并得到错误: DbConnection.Query().OrderByField("Id", false).ToList(); "不包含 OrderByField 的定义"
    • 我刚刚测试过了。看起来不错。 “DbConnection”的声明是什么
    猜你喜欢
    • 2012-10-14
    • 2011-09-01
    • 2016-02-27
    • 2019-12-26
    • 2011-08-29
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多