2017-12-08 34 views
2

データベースの列名を持つ文字列パラメータ(paramType)を送信するメソッドがあります。 Select文でカラムの値を取得したいのです。データベースの列名と実際の列値の文字列パラメータ

paramTypeをその列の値に置き換える必要があります。

var details = DetailsRepository 
         .Find(application => application.Created > compareDate) 
         .Select(m => new {m.ApplicationId, paramType }) 
         .Distinct(); 

paramTypeをカラムの名前に置き換えるだけでよいのは、Selectです。私がparamtype = "Address"を持っていれば、2番目の要素をm.Addressにします。

+0

paramTypeを列の名前に置き換えるだけで、Selectです。私がparamtype = "Address"を持っていれば、2番目の要素をm.Addressにします。私の質問をクリアすることを願っています。 –

答えて

0

paramTypeの値がメンバー名前である場合には、実行時に式ツリーを構築する必要がありますこれを行います。これはの可能なですが、選択するすべての列が常に同じタイプでなければ、扱いにくいです。さらに複雑なです。ラムダのタプルを選択する必要があります。

static Expression<Func<Application, T>> BuildTupleSelector<T>(
    string paramType, Func<T> usedForGenericTypeInference) 
{ 
    var m = Expression.Parameter(typeof(Application), "m"); 
    var body = Expression.New(typeof(T).GetConstructors().Single(), 
     new Expression[] { 
      Expression.PropertyOrField(m, nameof(Application.ApplicationId)), 
      Expression.PropertyOrField(m, paramType) 
     }, 
     new MemberInfo[] 
     { 
      typeof(T).GetProperty("ApplicationId").GetGetMethod(), 
      typeof(T).GetProperty("Value").GetGetMethod() 
     }); 
    return Expression.Lambda<Func<Application, T>>(body, m); 
} 

と:あなたはここで必要悪の量を示してこれを、試みることができる:率直に言って、


編集...この場合には、動的SQLを記述するために容易になるだろう使用方法:

var details = DetailsRepository 
    .Find(application => application.Created > compareDate) 
    .Select(BuildTupleSelector(paramType, 
     () => new { ApplicationId = 123, Value = "abc" })) 
    .Distinct(); 

詳細今べきint ApplicationIdstring Valueと匿名型。

+0

私はちょうど列の名前でparamTypeを置き換える必要があります。私がparamtype = "Address"を持っていれば、2番目の要素をm.Addressにします。 –

+0

@PiyushChandraはい、あなたがしたいことを理解しています。それは単純ではありません。私が言うように、あなたは実行時に式ツリーを構築することでこれを行うことができます。今すぐ興味のある列:それらはすべて同じタイプですか?おそらく 'string'である' Address'と言います。興味のある列も 'string'ですか?もしそうなら、私たちはおそらく*それについて行うことができますが、反射、表現木、おそらくジェネリックの乱用、おそらくカスタムツリーリライタなどを含む恐ろしいことになります。あなたが求めているものは簡単ではない*。これをSQLとして書く:*は簡単です。 –

+0

はい。すべての列は文字列のみです。 –

関連する問題