【问题标题】:IMongoQueryable OrderBy dynamic Property NameIMongoQueryable OrderBy 动态属性名称
【发布时间】:2021-11-29 17:39:40
【问题描述】:

我正在尝试使用属性字符串通过反射来订购我的 IMongoqueryable 集合。

不幸的是,我收到了Only fields are allowed in a $sort.的消息

private static void SetOrderBy(ref IMongoQueryable<Trade> trades, BlazorGridRequest request)
{
    var prop = typeof(Trade).GetProperty(request.OrderBy);

    if (request.OrderByDescending)
        trades = trades.OrderByDescending(t => prop.GetValue(t));
    else
        trades = trades.OrderBy(t => prop.GetValue(t));
}

谁能帮我弄清楚,我怎样才能让它工作? 谢谢!

【问题讨论】:

  • 我认为您在这里需要的是创建一个自定义表达式并将其传递给适当的OrderByX:Expression&lt;Func&lt;Trade, string&gt;&gt; orderExpression = (e) =&gt; e.OrderBy;
  • Trade 没有 OrderBy 属性。 request.OrderBy 是一个包含Trade 属性名称的字符串。所以我不能在表达式中使用e.OrderBy...

标签: mongodb-.net-driver iqueryable


【解决方案1】:

感谢dododo的cmets,我找到了以下解决方案:

private static void SetOrderBy(ref IMongoQueryable<Trade> trades, BlazorGridRequest request)
{
    ParameterExpression pe = Expression.Parameter(typeof(Trade), "t");
    MemberExpression me = Expression.Property(pe, request.OrderBy);
    Expression conversion = Expression.Convert(me, typeof(object));
    Expression<Func<Trade, object>> orderExpression = Expression.Lambda<Func<Trade, object>> (conversion, new[] { pe });

    if (request.OrderByDescending)
        trades = trades.OrderByDescending(orderExpression);
    else
        trades = trades.OrderBy(orderExpression);
}

【讨论】:

    猜你喜欢
    • 2012-08-21
    • 1970-01-01
    • 2016-10-21
    • 2018-04-16
    • 2017-07-28
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多