あなたはそれが、DBプロバイダとあなたがこのような式の木が何かを行うことができますのIQueryableを与える何かを仕事をしたい場合。これらのクラスを考えると
:
public class BaseEntity
{
public int Id { get; set;}
}
public class Product : BaseEntity
{
public string Name { get; set; }
public string Category { get; set; }
}
は今、あなたは、式を作成する機能を必要とする:C#6で
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;
}
それが)がNameOf(とそれらの魔法の文字列を置き換えるために、より良い習慣です。今、限り、あなたのLINQプロバイダは、あなたが問題ないはずSelectListItemsを作るに対処することができるよう
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();
: は最終的に、あなたはこのようなものでそれを呼び出すことができます。
ご不明な点特定の問題を明確にしたり、詳細を追加して必要なものを正確に強調してください。現在書かれているとおり、あなたが求めていることを正確に伝えるのは難しいです。 – Nkosi
mmと書いてありますが、Expression>プロパティはオブジェクトを返す必要があります。 –
@Awesome、 'Text = property(p).ToString()'の関数を呼び出してください。あなたは基本的に選択のための表示テキストを構築する方法を尋ねていますか? – Nkosi