4

重複の可能性:
動的 LINQ OrderBy

Iqueryable への動的ソートを作成しようとしています。
以下では、スタックオーバーフローでここに表示されているいくつかの例に従っていることがわかります。

 var query = dalSession.Query<T>();
            var res = (from x in query orderby Extensions.Sort<T>(query, "FirstName") select x).Skip((paging.CurrentPageRecord)).Take(paging.PageSize);


public static class Extensions
{
    public static IQueryable<T> Sort<T>(this IQueryable<T> query,
                                             string sortField)
    {
        return query.OrderByDescending(s => s.GetType()
                                             .GetProperty(sortField));

    }
} 

これは私が得る例外です:

System.Linq.IQueryable 1[Partners.BusinessObjects.Affiliate] Sort[Affiliate](System.Linq.IQueryable1[Partners.BusinessObjects.Affiliate], System.String)

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NotSupportedException: System.Linq.IQueryable`1[Partners.BusinessObjects.Affiliate] Sort[Affiliate](System.Linq.IQueryable`1[Partners.BusinessObjects.Affiliate], System.String)
4

2 に答える 2

3

問題はここにあります:-

s => s.GetType().GetProperty(sortField)

IQueryable の結果セットにアクセスしようとすると、結果セットは SQL に変換され、クエリは (メモリ内で実行されるのではなく) データベースに対して実行されます。問題は、明らかにデータベースがあなたの型について何も知らず、それらに対してメソッドを呼び出すことができず、それらに対してリフレクションを実行できないことです。

SQL に変換できる独自の式ツリーを構築する必要があります。式 API は非常に複雑で、実際に取得したい場合は、かなりの量を読む必要があります。式 API を使用して動的クエリを作成するための良い出発点は次のとおりです

ありがたいことに、あなたの特定のケースはかなり単純であり、ここに、ここに、そしてここにその実例がありますが、何が起こっているのかを理解するためにそれを読むことを本当にお勧めします. 単にコピペすると、あなたや他の誰かがそれを維持しなければならず、本当に悲しい時間を過ごすことになります.

于 2012-11-06T13:57:01.863 に答える
-1

あなたの queryable は、本当に必要なときにのみデータのプルを開始します。簡単なトリックで負荷を強制することができます long dummy = query.Count();. これは完全な解決策ではありません。クエリ ツリーを構築する複雑さを回避したいので、コレクションが極端に大きくない場合は、ソート可能な型に変換するだけです。

于 2012-11-06T14:14:47.950 に答える