次の署名を持つアクションを持つ標準のASP.NETMVC3コントローラーがあります。
public ActionResult Index(int? page, string sort, string sortDir)
ビューはWebGridを使用しているため、パラメーターは自動的に生成されます。
次に、Dynamic Expressions API(別名Dynamic LINQ)を使用して、パラメーターをクエリに変換します。例:
var customerSummary = CustomerManager.CustomerRepository.GetQuery()
.OrderBy(sort + " " + sortDir)
.Select(c => new CustomerSummaryViewModel()
{
Id = c.Id,
Name = c.Name,
IsActive = c.IsActive,
OrderCount = c.Orders.Count
})
.Skip(page.Value - 1 * 10) //10 is page size
.Take(10)
.ToList();
目標
私がやりたいのは、Dynamic Expressions API自体を使用して、並べ替えのパラメーターを検証することです(そして、おそらく有効なラムダを作成します)。たとえば、DynamicExpression.Parse()
またはDynamicExpression.ParseLambda()
メソッドを使用して、それらが生成ParseException
されるかどうかを確認したいと思います。その場合、誤ったパラメータをデフォルトに置き換えることができます(たとえば、「NameASC」の昇順で名前で並べ替える)...
問題
問題は、IQueryable
拡張機能が文字列のみを取得することです。使用したい場合にParseLambda
それをフィードすると、.OrderBy
方向を使用できません(プロパティ名のみを取得します)。たとえば、私はこれを行うことができます:
var se = DynamicExpression.ParseLambda<Customer, string>("Name"); // now I can use .OrderBy(se) which is same as .OrderBy(c=>c.Name)
しかし、これではありません
var se = DynamicExpression.ParseLambda<Customer, string>("Name DESC");
要約
Dynamic LINQを使用して、1)検証し、2)アクションパラメーターに基づいて(並べ替え用の)述語を作成したいと思います。