2009-06-16 14 views
0

これは非常に短い質問であり、私もその答えが短いことを恐れる。LINQ CompiledQuery.Compileと動的ソート?

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を使用してコンパイルされたクエリを使用することは可能ですか?

答えて

0

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; 

} 
+0

私はこれを知っています。明らかに、10個の項目をソートしても何の問題もありませんが、ページを作成しようとすると、列単位でソートされたレコードをページングしている場合スライスがそこで行われるように見える問題になります。しかし、アイデアに感謝しますが、実際にあなたの答えを読む方法は単純な "いいえ、これは不可能です"と思われます。 – kastermester

+0

ページングしている場合は、並べ替え後にToListする必要はありません。スキップして実行する必要があります。 –

+0

私が話している問題は、コレクションを考えてみましょう.1000.000個のアイテムを考えてみましょう。そして、var list = myCollection.OrderBy(s => s.Title).Skip(5000).Take(10).ToList();を実行します。このアプローチでは、データベースのコレクション全体を取り出し、ソートしてスキップして実行する必要があると提案します(つまり、これは遅くなります)。コンパイルされたクエリを使用するという私の考えは、より速く、遅くはないということです。 – kastermester

1

私がこれを解決することを知っている唯一の方法は、2つのクエリをコンパイルすることです。各ソート順に1つずつ、コンパイルされた正しいクエリーに委譲するヘルパーでラップします。