【问题标题】:LINQ CompiledQuery.Compile and dynamic sorting?LINQ CompiledQuery.Compile 和动态排序?
【发布时间】:2009-06-16 16:55:51
【问题描述】:

这是一个很短的问题,我担心答案也很短。

有什么办法可以做任何事情

Func<DataContext, string, bool, IEnumerable<X> fnMyQuery = CompiledQuery.Compile<DataContext, string, bool IList<X>(
     (db, sortColumn, sortDesc) => (
          (!sortDesc)?
              db.OrderBy(x => DynamicResolve(sortColumn))
          :
              db.OrderByDescending(x => DynamicReolve(sortColumn))
      ));

换句话说,我想创建一个编译后的查询,它可以接受一列和一个排序顺序,然后以所需的方式对我的结果进行排序 - 我可以在没有查询的情况下弄清楚如何做到这一点已编译 - 但是否可以使用 LINQ to SQL 编译查询?

【问题讨论】:

    标签: .net sql linq


    【解决方案1】:

    我知道解决这个问题的唯一方法是编译两个查询。每个排序顺序一个,然后用一个委托给正确编译查询的助手包装它。

    【讨论】:

      【解决方案2】:

      CompiledQuery.Compile 的重点是生成一个完全翻译并准备就绪的方法来评估查询。

      完全翻译。

      当然,没有什么可以阻止您在数据库之外进行排序(源可能是编译后的查询)。

      public IList<T> SortedResults<T>(IEnumerable<T> source,
        string sortColumn, bool sortDesc)
      {
        List<T> results = source.ToList();
        if (!sortDesc)
        {
          results = Enumerable
            .OrderBy(results, x => DynamicResolve(sortColumn))
            .ToList();
        }
        else
        {
          results = Enumerable
            .OrderByDescending(results, x => DynamicResolve(sortColumn))
            .ToList();
        }
        return results;
      
      }
      

      【讨论】:

      • 我知道这一点,显然没有问题,比如对 10 个项目进行排序,但是在尝试分页时,如果您要对按列排序的大量记录进行分页 - 排序然后在客户端就成为一个问题,因为切片也是在那里完成的。不过感谢您的想法,但我怀疑真正阅读您的答案的方法是简单的“不,这是不可能的”。
      • 如果你是分页的,你不应该在排序后ToList...你应该跳过和采取。
      • 我所说的问题是,考虑一个集合,比如说 1.000.000 个项目。你做 var list = myCollection.OrderBy(s => s.Title).Skip(5000).Take(10).ToList();使用您建议的方法,我必须取出整个数据库集合,然后对其进行排序,然后跳过并获取(即,这会很慢!)。对我来说,使用编译查询的想法是更快——而不是更慢。
      • 您在问题的示例代码中有 ToList。如果您运行它,数据库将订购并返回所有 1 M 项。
      • Woops - 这是一个错误,这里的想法是编译一个查询以避免冗余表达式树解析,但仍然让数据库完成所有繁重的工作 - 感谢您接受 - 我会更改它以反映更改。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多