1

asp.net 4.0 Web アプリで JqGrid を使用していますが、列の並べ替えを実装したいと考えています。私の問題は、レポ クラスの Get メソッドには、パラメーターによる並べ替えの Expression> タイプが必要なことです。

public IEnumerable<TEntity> Get<TOrderBy>(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TOrderBy>> orderBy, int pageIndex, int pageSize, out int totalNumberOfRecords, SortOrder sortOrder = SortOrder.Ascending)
        {
            IEnumerable<TEntity> list = null;
            int numberOfRecordsToSkip = CalculateNumberOfRecordsToSkip(pageIndex, pageSize);
            if (sortOrder == SortOrder.Ascending)
            {
                list = GetQuery().Where(predicate).OrderBy(orderBy).Skip(numberOfRecordsToSkip).Take(pageSize).AsEnumerable().ToList();            
            }
            else
            {
                list = GetQuery().Where(predicate).OrderByDescending(orderBy).Skip(numberOfRecordsToSkip).Take(pageSize).AsEnumerable().ToList();
           }

            totalNumberOfRecords = GetQuery().Count(predicate);
            return list;
        }

コンパイル時にエンティティの型しかわかっていない場合、その式による並べ替えを作成するにはどうすればよいですか? 任意の列 (または必要に応じてエンティティ プロパティ) でグリッドを並べ替えられるようにしたいと考えています。

式による並べ替えを作成するメソッドは、1 つのパラメーターを取り、それが列名です。

public Expression<Func<TEntity, TOrderBy>> CreateOrderByExpression(string sortColumn)
{

 // I don't know the TOrderBy type before this method is called. I know the TEntity type  // so getting the type of the sortColumn is easy. 
// But how do I create the Expression<Func<TEntity, TOrderBy>> from here ?

}

したがって、CreateOrderByExpression メソッドの結果は、レポ クラスの Get メソッドのパラメーターとして使用する必要があります。

何か提案はありますか?

4

1 に答える 1

1

DynamicLinq lib (実際には 1 つの .cs ファイル) を使用できます。

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

私はこれをチェックしませんでしたが、一見の価値があると確信しています: https://nuget.org/packages/DynamicLINQ

編集: Nugget パッケージの例: http://weblogs.asp.net/davidfowler/archive/2010/08/19/dynamic-linq-part-2-evolution.aspx (とても見栄えがよく簡単です!)

于 2012-05-16T16:16:50.423 に答える