2013-02-06 29 views
0

我意識到有很多與此有關的帖子,我已經廣泛研究,似乎無法弄清楚這一點。它應該是非常簡單的。我只需要生成一個具有動態列名稱的列域。類似於唯一的列值Linq動態地(Entity)表達式樹

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

其中「列」是動態參數值。我開始構建表達式樹並動態生成查詢表達式

ParameterExpression pe = Expression.Parameter(typeof(CITATION), "c"); 
Expression theColumn = Expression.Property(pe, typeof(string).GetProperty(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

謝謝傑夫。這有幫助 – 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); 

它會顯示對應你把表達屬性的「全名」 。