2014-04-11 118 views
2

我試圖在我的Lambda express中動態生成模型屬性。在我的控制,我有以下方法:在Lambda表達式中爲模型屬性使用動態值

public ActionResult FilterSubCategory(string filter, string selected) 
{ 
    IList<Item> model = db.Items.Where(p => p.Make == selected).ToList(); 
    var viewModel = Mapper.Map<IList<ItemViewModel>>(model); 
    return View("~/Views/Phone/Index.cshtml", viewModel); 
} 

我想用這個方法,所以我通過過濾器(型號屬性過濾)和實際選定的屬性值來篩選我的網頁欄。

我想更換「製作」(「硬編碼」在這裏)這裏與過濾字符串傳遞的價值。有沒有辦法做到這一點?

+0

你有沒有考慮的使用[動態LINQ(http://dynamiclinq.codeplex.com/)? –

+1

[我如何動態創建以下LINQ表達式?](http://stackoverflow.com/questions/22916231/how-do-i-create-the-following-linq-expression-dynamically) – Servy

+0

@Servy謝謝你的鏈接。這個解決方案非常有效。對不起,重複! Upvoted在這裏和原始線程。 –

回答

0

這是我做的:

public static Expression<Func<TModel, TProperty>> GenerateModelExpression<TModel, TProperty>(PropertyInfo property) 
{ 
    ParameterExpression fieldName = Expression.Parameter(typeof(TModel), "m"); 

    var propertyExpr = Expression.Property(itemExpr, property.Name); 

    return Expression.Lambda<Func<TModel, TProperty>>(propertyExpr, fieldName); 
} 

的屬性參數將是你的情況,你可以得到使用反射「製作」。

https://github.com/AmmarCSE/razor-grid

編輯

更精確地審查這個問題,並通過@Servy,How do i create the following LINQ expression dynamically?引用前answery後,這裏是一個解決方案:

public static Expression<Func<TModel, TProperty>> GenerateModelExpression<TModel, TProperty>(string filter, string select) 
{ 
    ParameterExpression param = Expression.Parameter(typeof(TModel), "m"); 
    var body = Expression.Equal(Expression.Property(param, typeof(TModel).GetProperty(filter)) 
     , Expression.Constant(select)); 

    return Expression.Lambda<Func<TModel, TProperty>>(body, param); 
} 
+0

這實際上是一個自定義的「選擇」,並不會將該屬性值與要過濾的值進行比較。 – Servy

+0

嗨@Servy,我以爲用戶在問如何動態構建lambda表達式本身? – AmmarCSE

+0

他問如何過濾一個屬性(由其字符串名稱確定)等於字符串值的查詢。這並不是那樣做的。 – Servy