【问题标题】:LINQ to SQL dynamic order by with IN operator?LINQ to SQL 使用 IN 运算符动态排序?
【发布时间】:2010-12-31 03:37:26
【问题描述】:

我有以下 LINQ 查询:

using (var db = new MyDataContext()) {
    int[] onlineUsers = GetOnline();
    var users = (from u in db.Users orderby 
        (onlineUsers.Contains(u.u_username) && 
        u.u_hasvisible_photo) descending,
        u.u_lastlogin descending select 
        u.u_username).Skip(startRowIndex).
        Take(maximumRows).ToList();
}

这工作正常,并使用 IN 运算符生成 SQL 查询。

问题是 int[] 中的每个 int 都通过不同的参数传递,我知道 SQL 每个查询的参数限制为 2100 个。

我认为使用 LINQ 动态库 OrderBy 进行排序会更好。

使用 .OrderBy(orderquery) 代替“onlineUsers.Contains(u.u_username) && u.u_hasvisible_photo) 降序”。

我在网上搜索了执行此操作的指南或示例,但找不到任何帮助。社区可以帮助我提供可能帮助我实现此操作的代码或链接吗?

【问题讨论】:

    标签: linq dynamic sql-order-by


    【解决方案1】:

    如果您使用的是 SQL Server 2008,您可以创建一个标量函数,该函数接受 table-valued parameter,然后将数组按原样传递。不过,它可能需要 LINQ 提供程序的特殊哄骗(您没有指定您使用的是哪一个(Linq-to-Entities 或 Linq-to-SQL,我假设是 SQL Server,即使您只是说“sql” ),所以我不确定查询的可组合性。

    您可能想要做的是创建一个table valued user-defined function,它采用表值参数(以及您可能拥有的任何其他参数)并通过 LINQ 公开它(您应该能够从表值创建可组合的东西函数),然后从那里继续。

    【讨论】:

      【解决方案2】:

      这是 Linq to SQL 的示例,它允许您动态排序。该示例使用 Northwind 数据库,您可以简单地使用 LinqPad 进行尝试:

      void Main()
      {
      
          // Demonstrates dynamic ordering
      
          var SortExpression = "Total"; // choose ProductName or Total
          var sortAscending = true; // choose true for ascending, false for descending
      
          // the query to sort
          var data = (from pd in Products
                              join od in OrderDetails on pd.ProductID equals od.ProductID into DetailsByProduct
                              select new { ProductName = pd.ProductName, Total = DetailsByProduct.Count()}).ToList();
      
          // the data source you can use for data binding                     
          var ds= (sortAscending) 
              ? data.OrderBy(x => x.GetType().GetProperty(SortExpression).GetValue(x, null))
              : data.OrderByDescending(x => x.GetType().GetProperty(SortExpression).GetValue(x, null));
      
          ds.Dump();
      }
      

      尝试将"Total"替换为"ProductName"(变量SortExpression),或者使用false(变量sortAscending)进行降序排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多