【问题标题】:Building LINQ Dynamic Order Clause, But Cast Field构建 LINQ 动态顺序子句,但强制转换字段
【发布时间】:2023-03-03 11:48:01
【问题描述】:

下面的代码很好用,我想动态构建一个orderby:

    public static IQueryable<TEntity> OrderByAnyField<TEntity>(this IQueryable<TEntity> source, string orderByProperty, bool desc, Type propertyType)
    {
        string command = desc ? "OrderByDescending" : "OrderBy";
        var type = typeof(TEntity);
        var property = type.GetProperty(orderByProperty);
        var parameter = Expression.Parameter(type, "p");
        var propertyAccess = Expression.MakeMemberAccess(parameter, property);
        var orderByExpression = Expression.Lambda(propertyAccess, parameter);
        var resultExpression = Expression.Call(typeof(Queryable), command, new Type[] { type, property.PropertyType },
                                      source.Expression, Expression.Quote(orderByExpression));
        return source.Provider.CreateQuery<TEntity>(resultExpression);
    }

所以,我希望能够更改排序的 CAST。所以,作为一个例子,我想采取:

    .OrderBy(x => x.Something)

改为这样做:

    .OrderBy(x => double.Parse(x.Something))

非常感谢任何帮助

【问题讨论】:

  • 当 linq 已经为您提供了对任何属性进行排序的功能时,那么要在这里实现什么?
  • 我需要按传递的列名动态排序。我还需要“投”专栏。因此,我使用上面的代码按传递的列名进行排序。 (即 .OrderByAnyField(passedColumnName, false, typeof(double)) )。 passColumnName 可以是源中任何列的名称。
  • 为了清楚起见,让我添加到我的评论中。我可以按列排序,与 .OrderBy(x => x.Something) 相同。我想通过转换为不同的数据类型进行排序,例如 .OrderBy(x => double.Parse(x.Something))。如果我尝试使用不同的数据类型,在 resultExpression 中,我会收到一个错误:

标签: linq dynamic expression


【解决方案1】:

我正在分享一种更简单的方法来做同样的事情。您可以根据需要添加泛型。您可以随意播放数据

static object GetOrder(Table tb, string propertyName, bool desc)
{
    if (desc)
        return 0;

    PropertyInfo pI = typeof(Table).GetProperty(propertyName);
    var val = pI.GetValue(tb);
    return val;
}

static object GetOrderDesc(Table tb, string propertyName, bool desc)
{
    if (!desc)
        return 0;

    PropertyInfo pI = typeof(Table).GetProperty(propertyName);
    var val = pI.GetValue(tb);
    return val;
}

static void Main(string[] args)
{
    bool desc = false;

    List<Table> table = new List<Table>() {
            new Table() { ID = "03", X = "Str1", Y = "C1", P = 10 },
            new Table() { ID = "04", X = "Str1", Y = "C1", P = 5 },
            new Table() { ID = "05", X = "Str1", Y = "C1", P = 1 },
            new Table() { ID = "06", X = "Str1", Y = "C1", P = 2 },
            new Table() { ID = "07", X = "Str2", Y = "C1", P = 25 },
            new Table() { ID = "08", X = "Str2", Y = "C1", P = 4 },
            new Table() { ID = "09", X = "Str1", Y = "C2", P = 411 },
            new Table() { ID = "10", X = "Str1", Y = "C2", P = 2356 },
            new Table() { ID = "11", X = "Str2", Y = "C2", P = 12 },
            new Table() { ID = "12", X = "Str2", Y = "C2", P = 33 },
        };

    var sortedTable = table.OrderBy(x => GetOrder(x, "P", desc)).OrderByDescending(x => GetOrderDesc(x, "P", desc));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2014-12-26
    相关资源
    最近更新 更多