9

次のコードがあります。

public List<anEntity> Get(int page, int pagesize, Func<anEntity, IComparable> orderby)
{            
    using (var ctx = new MyContext())
    {                
        return ctx.anEntity.OrderBy(orderby).Skip(pagesize * page).Take(pagesize).ToList();                    
    }           
}

データベース プロファイル (SqlServer 2012) を確認すると、"TOP" 句がない恐ろしい全テーブル スキャンが表示されます。

興味深い部分:

同様のことを行うが、具体的な orderby を指定する場合:

return ctx.anEntity.OrderBy(x => x.aField).Skip(pagesize * page).Take(pagesize).ToList();

プロファイルには、美しい「TOP」句が表示されます。

「オーダーバイ」の可能性ごとに1つずつ、多くのメソッドを持つことは避けたいと思います。どんなヒントでも大歓迎です。

4

1 に答える 1

13

これorderbyは、パラメーターが式ではなく関数であるためです。任意の関数をSQLに変換する方法はないため、その関数を呼び出す前に、すべてのデータをクライアント側に配置する必要があります。

パラメータタイプをに変更しますExpression<Func<anEntity, T>>。ここで、はメソッドにT追加する必要のある新しいジェネリックパラメータでGetあり、期待どおりに機能します。

もちろん、カスタムを使用することはできませんがIComparable、それを回避する方法はありません。カスタムコードをSQLに変換することはできません。

于 2012-10-03T14:06:26.853 に答える