C# 如何按IQueryable的方向更改订单

C# 如何按IQueryable的方向更改订单,c#,sql-order-by,iqueryable,C#,Sql Order By,Iqueryable,我有一些函数(X),它返回IQueryable,并带有“OrderBy(X=>X.Name)”。 我想在新代码中使用X函数,但在这段代码中有一个参数决定顺序(asc/desc) 我不想更改(X),因为它已经在多个地方使用过了 可以选择获取X(),然后取消它的“OrderBy”,然后应用新订单 (现在它抛出异常,因为它类似于Y.OrderBy(a=>a.Name).OrderByDescending(a=>a.Name)) “在排序依据列表中多次指定了列。排序依据列表中的列必须是唯一的。\r\n无

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

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

可以选择获取X(),然后取消它的“OrderBy”,然后应用新订单

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

“在排序依据列表中多次指定了列。排序依据列表中的列必须是唯一的。\r\n无法准备说明。”

使用

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

我曾尝试晃动IOrderedQueryable的Expression对象,您的方法实际上正在返回(我错了吗?),但到目前为止运气不佳,而且我看不到操作System.Linq.Expression或System.Linq.EnumerableQuery的选项,使用它来代替更改X()方法非常简单

IMHO,您应该从以下选项中进行选择:

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

你能为我澄清一下,如果你说的是“函数”,你心目中的sql函数是通过应用程序中的ORM(如实体框架)映射的,还是使用自定义提供程序返回IQueryable的普通方法?

我认为你需要编写两个分支,一个是orderby,另一个是orderbydescending。我希望我知道一个更优雅的解决方案..在最后一个案例中,你有什么例外?这应该是次优的,但仍然有效。@Jonhana例外情况是“排序依据列表中指定了多次列。排序依据列表中的列必须是唯一的。\r\n无法准备语句。”啊。我想这是有道理的。我想我应该使用默认值对该方法进行本地化更改,这样其他调用方就不必更新了。@JonHanna在EF 6中,它可以与多个orderby一起工作,因此您部分是正确的。我认为这取决于提供程序。如果它有效的话很简单,但有些查询提供程序不能。