2017-03-15 6 views
2

필드 이름 목록을 가져 와서 해당 열만 동적 컬렉션으로 반환하도록 IQueryable을 확장하려고합니다. 본질적으로 필자는 필드/열 이름으로 전달 된 "선택"을 구현하려고합니다. 내가 좋아하는 대상에 대해 질의하고 경우에 따라서.NET에서 필드 이름이있는 IQueryable Select 절을 동적으로 빌드하십시오.

private IQueryable<TEnity> SetSelect(IQueryable<TEntity> query, List<string> fieldnames) 
{ 
    //Build up the Expression here 
    query = query.Select(expressionHere); 
    return query; 
} 

: : 방법은 다음과 같이 보일 것이다

public Class Dog 
{ 
    int Id{get;set;} 
    string Name{get;set;} 
    string Color{get;set;} 
    DateTime Birthdate{get;set;} 
} 

하지만 단지 이름을 얻고 싶었다과 생년월일 나는 SetSelect(query, new List<string>{"Name", "Birthdate"});를 호출하여 된 IQueryable을 확장 할 수

그리고는 반환되는 :

[{"Fido", 01-01-2017}, {"Spot", 05-04-1972}] 

가 있음 아무도 비슷한 것을 한 적이 없으며 그 Expression을 구축하는 데 도움이 될 수 있습니까?

설명해 주셔서 감사합니다.

참고 :이 당신은 기업의 선택에 전화 DynamicSelectGenerator에 의해 선택 동적 생성 할 수 닷넷 핵심 응용 프로그램

+0

이 보이는 이미 http://stackoverflow.com/questions/606104/how-to-create-linq [여기] (답변하기 -expression-tree-to-an-anonymous-type) – danatcofo

+0

키 포인트 하나를 추가하는 것을 잊어 버렸습니다. 이것은 .Net 핵심 애플 리케이션입니다. 위에서 언급 한 대답은 내가 알고있는 일부 수업을 사용하지 않습니다. – KickinMhl

+0

동일한 질문에 대한 마지막 답변 [바로 가기] (http://stackoverflow.com/a/28140345/740108)은 작업 솔루션으로가는 쉬운 경로 일 수 있습니다. – danatcofo

답변

0

입니다.

public static Func<T, T> DynamicSelectGenerator<T>(string fields) 
      { 
      // get Properties of the T 
      var fields = typeof(T).GetProperties().Select(propertyInfo => propertyInfo.Name).ToArray(); 

      // input parameter "o" 
      var xParameter = Expression.Parameter(typeof(T), "o"); 

      // new statement "new Data()" 
      var xNew = Expression.New(typeof(T)); 

      // create initializers 
      var bindings = fields.Split(',').Select(o => o.Trim()) 
       .Select(o => 
       { 

        // property "Field1" 
        var mi = typeof(T).GetProperty(o); 

        // original value "o.Field1" 
        var xOriginal = Expression.Property(xParameter, mi); 

        // set value "Field1 = o.Field1" 
        return Expression.Bind(mi, xOriginal); 
       } 
      ); 

      // initialization "new Data { Field1 = o.Field1, Field2 = o.Field2 }" 
      var xInit = Expression.MemberInit(xNew, bindings); 

      // expression "o => new Data { Field1 = o.Field1, Field2 = o.Field2 }" 
      var lambda = Expression.Lambda<Func<T, T>>(xInit, xParameter); 

      // compile to Func<Data, Data> 
      return lambda.Compile(); 
     } 

그리고이 코드에 의해 예를 들어, 사용

:

var result = dbContextInstancs.EntityClass.Select(DynamicSelectGenerator<EntityClass>("Name", "Birthdate")); 
+1

메소드의 매개 변수 "fields"를 T 매개 변수의 전체 필드 목록으로 대체했습니다. 그렇다면 어떻게 제한된 목록을 만들 수 있습니까? – GregJF

+0

@GregJF _ 제한된 목록의 의미는 무엇입니까? 내 대답 예제에서는'fields' 매개 변수가'("Name", "Birthdate")'입니다 ...'함수에 더 많거나 적은 필드를 보낼 수 있습니다. –