动态链接到实体的唯一列值(表达式树)
本文关键字:表达式 唯一 链接 实体 动态 | 更新日期: 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"。