2012-01-25 2 views
2

をソートする機能にフィールドを渡す:私は他のものの間でモデルデータをソートしています。このようなシグネチャを持つ関数を書いています、そのフィールドに

public MyModel GetModel(IQueryable<Something> query, string sort, 
    int page, int PageSize) 
{ 
    ... 
    viewModel.Something = query.OrderByDescending(o => sort) 
      .Skip((page - 1) * pageSize).Take(pageSize).ToList(); 
    ... 
} 

問題は、私はAに渡したいですデフォルトのソートパラメータ。ソートパラメータは、ソートパラメータがnullまたは空の場合にソートするものです。たとえば、これは次のようになります。

.OrderByDescending(o => o.AddedDate); 

私はレコードをソートするAddedDateまたは何でも私が選択を使用することを伝えるために、この関数に何かを渡すために(機能に渡してインスタンスの)あらゆる種類のものを試してみましたsortがnullだが何も機能しない場合私はそのようなことをどのように実装しますか?

+0

[ダイナミックLINQのOrderBy](http://stackoverflow.com/questions/41244/dynamic-linq-orderby)の可能重複 – Eranga

答えて

3

現在のコードはあまり意味がありません。ソートするアイテムのプロパティではなく、単一の値でソートしています。Somethingクラス内の任意の文字列プロパティでソートできるようにしたい場合適切には、次のようになります。あなたがsortためnullに渡すと

public MyModel GetModel(IQueryable<Something> query, Func<Something, string> sort, 
    int page, int PageSize) 
{ 
    Func<Something, string> actualSort = sort ?? (o => o.AddedDate); 
    ... 
    viewModel.Something = query.OrderByDescending(actualSort) 
      .Skip((page - 1) * pageSize).Take(pageSize).ToList(); 
    ... 
} 

今ソートはAddedDateによってデフォルトのソート順に戻ります。

+1

私はOPを考えます実行時にソートキーを動的に選択できるようにするため、Funcはこの場合には機能しません。 –

+0

@ThomasLevesque:これは私が質問を読む方法ではありませんが、もちろん間違いかもしれません。 OPは明確にすることができます。 – BrokenGlass

+0

@トーマス - それはまさに私がやりたいことです。 –

1

Dynamic Linqを使用することをお勧めします。それはあなたが文字列としてソート・キーを渡すことができます:

query.OrderByDescending(sort)... 
+0

どうすればいいですか? –

+0

Visual StudioサンプルのDynamicQuery.csファイルをプロジェクトにコピーし、コードで 'using System.Linq.Dynamic;'を追加してください。インテリセンスで新しいOrderByオーバーロードが表示されます –

+0

私は検索しました。私はコンピュータにDynamicQueryを持っていません。 –