2017-12-08 10 views
2

데이터베이스의 열 이름을 가진 문자열 매개 변수 (paramType)를 보내는 방법이 있습니다. Select 문에서 열의 값을 가져 오려고합니다.실제 열 값에 대한 데이터베이스 열의 이름을 가진 문자열 매개 변수

paramType을 해당 열의 값으로 바꿔야합니다.

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

난 그냥 열이 선택 인의 이름으로 paramType를 교체해야합니다. paramtype = "Address"라고 가정하고 두 번째 요소가 m.Address가되도록합니다.

+0

paramType을 열의 이름으로 바꾸면됩니다. Select입니다. paramtype = "Address"라고 가정하고 두 번째 요소가 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을 Select로 대체해야합니다. paramtype = "Address"라고 가정하고 두 번째 요소가 m.Address가되도록합니다. –

+0

@PiyushChandra 예, 당신이하고 싶은 것을 이해합니다. 그것은 그렇게 단순하지 않습니다. 내가 말했듯이, 당신은 런타임에 표현 트리를 구축함으로써 이것을 할 수 있습니다. 이제 : 관심있는 항목 : 모두 동일한 유형입니까? 당신은'Address'를 언급합니다 - 이것은 아마도'string' 일 것입니다 : 당신이 또한'string'에 관심있는 모든 열입니까? 그렇다면 우리는 아마 * 할 수는 있지만 반사, 표현 트리, 아마 generics의 남용, 아마도 커스텀 트리 재 작성자 등을 포함하여 끔찍하게 추악 할 것입니다. 당신이 요구하는 것은 사소한 것이 아닙니다 *. SQL로 작성 : *는 사소한 것입니다. –

+0

예 .. 모든 열은 문자열입니다. –