0

我意识到有很多与此相关的帖子,我已经进行了广泛的研究,但似乎无法弄清楚这一点。它应该非常简单。我只需要生成一个具有动态列名的列域。就像是

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));

但仅此而已。提前致谢

4

2 回答 2

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();
    // ...
}
于 2013-02-06T20:14:55.487 回答
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);

它将显示与您在表达式中输入的属性相对应的“全名”。

于 2013-02-06T20:20:12.493 回答