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 ApplicationId
とstring Value
と匿名型。
paramTypeを列の名前に置き換えるだけで、Selectです。私がparamtype = "Address"を持っていれば、2番目の要素をm.Addressにします。私の質問をクリアすることを願っています。 –