2017-01-12 5 views
0

Expressionに基づいてクエリの一部を構築することは可能ですか?Linq to 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

mmと書いてありますが、Expression >プロパティはオブジェクトを返す必要があります。 –

+0

@Awesome、 'Text = property(p).ToString()'の関数を呼び出してください。あなたは基本的に選択のための表示テキストを構築する方法を尋ねていますか? – Nkosi

答えて

4

あなたはそれが、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(); 

: は最終的に、あなたはこのようなものでそれを呼び出すことができます。

+0

これはまさに私が望むものです!ありがとう。 –

関連する問題