2016-01-20 28 views
0

在EF,順序按允許使用的列名,例如排序依據(「說明」)的GroupBy條:爲了能夠在列名作爲一個字符串傳遞

我需要能夠做一些用的GroupBy類似的事情時,列類型被稱爲

var groupByExpressionGN2 = GetGroupByExpressionGuidNull<DebtWaiver>("PersonUID"); 

... 

// in the query 
.GroupBy(groupByExpression2) 

// the Expression function 
private static Expression<Func<TEntity,Guid?>> GetGroupByExpressionGuidNull<TEntity>(string property) 
{ 
    var item = Expression.Parameter(typeof(TEntity), "gb"); 
    var itemProperty = Expression.PropertyOrField(item, property); 
    var lambda = Expression.Lambda<Func<TEntity, Guid?>>(itemProperty, item); 

    return lambda; 
} 

但我的用戶可以通過它來組由

選擇任一列1

其他職位有解決方案,使我怎樣才能使殲結上述換取基的表達通過

我曾嘗試這樣的:

public static Expression<Func<T, object>> GetMember<T>(string memberName)// where T : EntityObject 
{ 
    ParameterExpression pe = Expression.Parameter(typeof(T), "p"); 
    System.Reflection.PropertyInfo pi = typeof(T).GetProperty(memberName); 
    return (Expression<Func<T, object>>)Expression.Lambda<Func<T, object>>(Expression.Convert(Expression.Property(pe, pi), typeof(object)), pe); 
} 

但它產生的:P =>轉換(p.PersonUID)

代替:P => p.PersonUID

問候

GregJF

回答

0

更有點經過測試(和一個良好的夜間睡眠),我得到了第二個方法的工作(感謝JA Rreyes

我的問題,我用這個是:

var groupByExpressionGN2 = GetGroupByExpressionGuidNull<DebtWaiver>("PersonUID"); 

... 

// in the query 
.GroupBy(groupByExpression2) 

我應該是這樣:

var groupByExpression2 = GetMember<DebtWaiver>("PersonUID"); 

... 

// in the query 
.GroupBy(groupByExpression2.Compile()) 

您可以在我原來的職位(GetMember)使用第二種方法,但我用這個方法(「因爲我喜歡它!):感謝:Taher Rahgooy

public static Expression<Func<T, object>> GetPropertySelector<T>(string propertyName) 
{ 
    var arg = Expression.Parameter(typeof(T), "gb"); 
    var property = Expression.Property(arg, propertyName); 
    var conv = Expression.Convert(property, typeof(object)); 
    var exp = Expression.Lambda<Func<T, object>>(conv, new ParameterExpression[] { arg }); 
    return exp; 
} 

問候

GregJF

相關問題