如果你想讓它與數據庫供應商合作,有事給你一個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應付你應該罰款。
不清楚你要問什麼請澄清你的具體問題或添加額外的細節,以確切地突出你所需要的。正如目前所寫,很難確切地說出你在問什麼。 – Nkosi
毫米,因爲你寫道..它看起來表達>屬性必須返回一個對象..是它嗎? –
@Awesome,調用項目Text = property(p).ToString()'的函數。你基本上在問如何構建select的顯示文本? – Nkosi