2017-01-12 65 views
0

是否有可能建立基於表達式的部分查詢?動態撰寫選擇使用Linq到SQL(EF6)

public List<SelectListItem> GetSelectedListFromEntity<T>(Expression<Func<T, object>> property) where T : BaseEntity<int> 
    { 
     var result = _repository.Query<T>().Select(p => new SelectListItem() 
     { 
      Text = property, //? (in simple case it looks like: p.Name + p.Category) 
      Value = p.Id.ToString(), 
     ).ToList(); 

     return result; 
    } 

爲:

var result = GetSelectedListFromEntity<Product>(p => p.Name + p.Category); 
+1

不清楚你要問什麼請澄清你的具體問題或添加額外的細節,以確切地突出你所需要的。正如目前所寫,很難確切地說出你在問什麼。 – Nkosi

+0

毫米,因爲你寫道..它看起來表達>屬性必須返回一個對象..是它嗎? –

+0

@Awesome,調用項目Text = property(p).ToString()'的函數。你基本上在問如何構建select的顯示文本? – Nkosi

回答

4

如果你想讓它與數據庫供應商合作,有事給你一個IQueryable你可以做這樣的表達式樹的東西。

考慮到這些類:

public class BaseEntity 
{ 
    public int Id { get; set;} 
} 

public class Product : BaseEntity 
{ 
    public string Name { get; set; } 
    public string Category { get; set; } 
} 

現在你需要一個功能,使表達:

public Expression<Func<T, SelectListItem>> CreateExpression<T>(Expression<Func<T, string>> textExp) where T : BaseEntity 
{ 
    var arg = textExp.Parameters.First();  
    var param = new ParameterExpression[] { arg }; 
    var body = Expression.MemberInit(
     Expression.New(typeof(SelectListItem)), 
     Expression.Bind(typeof(SelectListItem).GetMember("Text").First(), textExp.Body), 
     Expression.Bind(typeof(SelectListItem).GetMember("Value").First(), 
      Expression.Call(
       Expression.PropertyOrField(arg, "Id"), 
       "ToString", 
       new Type[0] 
       ))); 
    var exp = Expression.Lambda(body, param); 
    return (Expression<Func<T, SelectListItem>>)exp; 
} 

在C#6,最好的做法,以取代那些神奇的字符串與nameof()。 後來終於你可以像這樣把它叫做:

var items = new List<Product> { new Product { Id = 0, Name = "Test", Category = "Cat" } }; 

var result = items.AsQueryable().Select(CreateExpression<Product>(p => p.Name + p.Category)).ToList(); 

現在只要你LINQ提供程序可以使SelectListItems應付你應該罰款。

+0

這正是我想要的!謝謝。 –