2013-02-06 1 views
0

나는 이것과 관련된 많은 게시물이 있다는 것을 알고 있으며, 나는 광범위하게 연구했고 이것을 알아낼 수 없다. 그것은 아주 간단해야합니다. 동적 컬럼 이름을 가진 컬럼 도메인을 생성하기 만하면됩니다. 뭔가 같은고유 한 열 값 동적으로 엔티티에 Linq (표현식 트리)

public IEnumerable<ColumnEntity> GetColumnDomain(string column) 
{ List<ColumnEntity> columnEntities = new List<ColumnEntity>(); 
    var query = db.CITATIONs.Select(m => m."column").Distinct(); 
    .... 
} 

"column"은 동적 매개 변수 값입니다. 쿼리 식을 동적으로 생성하기 위해 빌드 및 표현 트리를 시작했습니다.

하지만 그게 전부입니다. 미리 감사드립니다.

답변

0

회원 액세스를 생성하려면 Expression.PropertyOrField() 메서드를 사용하십시오. 또한 열 유형을 알아야하거나 그렇지 않으면 작동하지 않습니다.

이 모든 일반적인 방법으로 일반화 될 수있다 :

public static Expression<Func<TSource, TResult>> 
    GenerateSelector<TSource, TResult>(string propertyOrFieldName) 
{ 
    var parameter = Expression.Parameter(typeof(TSource)); 
    var body = Expression.Convert(
     // generate the appropriate member access 
     Expression.PropertyOrField(parameter, propertyOrFieldName), 
     typeof(TResult) 
    ); 
    var expr = Expression.Lambda<Func<TSource, TResult>>(body, parameter); 
    return expr; 
} 

그런 다음 당신은 다만 수 :

public IEnumerable<ColumnEntity> GetColumnDomain<TColumn>(string column) 
{ 
    var query = db.CITATIONs 
     .Select(GenerateSelector<CITATION, TColumn>(column)) 
     .Distinct(); 
    // ... 
} 
+0

p.s. 변환이 필요하지 않을 수 있으며 아마도 제외 될 수 있습니다. 그것을 버리면 올바른 유형인지 확인해야합니다. 그렇지 않으면 문제가 발생할 것입니다. –

+0

감사합니다. Jeff. 도움이 된 – user2048150

0

그래서하지 당신이 계신 완전히 확인합니다. 그러나 단순히 넣어 :

public PropertyInfo GetPropertyInfo<T>(Expression<Func<T, Object>> expression) 
{ 
    MemberExpression memberData = (MemberExpression)expression.Body; 
    return (PropertyInfo)memberData.Member; 
} 

이 많이 그래서 만약 당신이, 당신이 멤버에 대한 속성 정보를 제공합니다 :

PropertyInfo info = GetPropertyInfo<FileInfo>(file => file.FullName); 
Console.WriteLine(info.Name); 

그것은 당신이 표현에 넣어 재산에 해당하는 '하면 FullName'를 표시합니다 .