2016-01-20 24 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

相关问题