动态链接到实体的唯一列值(表达式树)

本文关键字:表达式 唯一 链接 实体 动态 | 更新日期: 2023-09-27 17:58:08

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

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

其中"column"是动态参数值。我开始构建表达式树来动态生成查询表达式

ParameterExpression pe = Expression.Parameter(typeof(CITATION), "c");
Expression theColumn = Expression.Property(pe, typeof(string).GetProperty(column));

但仅此而已。提前感谢

动态链接到实体的唯一列值(表达式树)

使用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();
    // ...
}

所以不能完全确定你想要的是什么。但简单地说:

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"。