【问题标题】:how to change OrderBy direction of IQueryable如何更改 IQueryable 的 OrderBy 方向
【发布时间】:2017-07-23 16:09:21
【问题描述】:

我有一些函数 (X),它返回带有“OrderBy(x => x.Name)”的 IQueryable。 我想在新代码中使用 X 函数,但是在这段代码中有一个参数决定了顺序(asc/desc)。

我不想更改 (X),因为它已经在多个地方使用过。

有选择获取X(),然后取消它的“OrderBy”,并申请新订单?

(现在它抛出异常,因为它就像 Y.OrderBy(a => a.Name).OrderByDescending(a => a.Name))

“在 order by 列表中指定了不止一次的列。order by 列表中的列必须是唯一的。\r\n无法准备语句。”

【问题讨论】:

  • 我认为你需要编写两个分支,一个带有 orderby 另一个带有 orderbydescending。我希望我知道一个更优雅的解决方案..
  • 在最后一种情况下你得到什么异常?这应该是次优的,但仍然适用于 AFAICT。
  • @JonHanna the exception is '"在 order by 列表中指定了不止一次的列。order by 列表中的列必须是唯一的。\r\n无法准备语句。”
  • 啊。我想这是有道理的。我想我只需对方法进行本地化更改,使用默认值,以便不必更新其他调用者。
  • @JonHanna 在 EF 6 中它适用于多个 orderby,所以你是部分正确的。我认为取决于提供者。

标签: c# sql-order-by iqueryable


【解决方案1】:

使用

public void x(string order = string.empty)
{
  Y.OrderBy(a => a.Name);
  if (order == "desc")
  {
    Y = Y.Reverse();
  }
}

【讨论】:

  • 如果可行的话很简单,但某些查询提供程序might 不是support 它。
【解决方案2】:

我试图摆动 IOrderedQueryable 的 Expression 对象,您的方法实际上正在返回(我错了吗?)但到目前为止没有运气,我看不到操作 System.Linq.Expression 或 System.Linq 的选项.EnumerableQuery 很容易使用它而不是更改 X() 方法。

恕我直言,您应该选择:

  • 使用 Reverse()(@Eric Lizotte 回答)或 OrderByDescending() 创建某种包装方法 - 我猜这会更省时,但对于分组、过滤等,您必须创建全新的函数。
  • 从 X() 函数体中删除 OrderBy(),并修改您的旧代码 - 返回非排序结果将为您提供更大的灵活性和机会,让您在每个场景中通过 linq 表达式对结果执行您想要执行的操作会遇到的。

如果您在谈论“函数”,您能否为我澄清一下,您想到的是通过 ORM(例如实体框架)在您的应用程序中映射的 sql 函数,或者只是使用您的自定义提供程序的普通方法返回 IQueryable?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2020-04-15
    相关资源
    最近更新 更多