繁体   English   中英

C#Linq表达式使用变量的字符串值在lambda表达式中设置列名

[英]C# Linq expressions using the string value of a variable to set the column name in a lambda expression

我有以下元组:

Tuple<Expression<Func<Client, object>>, SortOrder>(x => x.ClientLastName, SortOrder.Descending)

在这种情况下,我知道实体-“客户端”,并且您正在使用“ ClientLastName”列。x => x.ClientLastName。

我想将其更改为实体为T的通用版本,并使用值keyValue.Key ...提供列名,例如,在这种情况下为keyValue.Key =“ ClientLastName”。

我尝试了这个:

        foreach (KeyValuePair<string, SortDirection> keyValue in sortItems) {
            tupleList.Add(new Tuple<Expression<Func<T, object>>, SortDirection>(x => keyValue.Key, keyValue.Value));
        };

即使T是Client并且keyValue.Key是列名“ ClientLastName”

在此处输入图片说明

它不起作用..它只是想出了:

在此处输入图片说明

它不会替换keyValue.Key的值,而是在使用实际值。

斯坦看到了他的回答

d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d))

我改为:

Tuple<Expression<Func<T, object>>, SortDirection>(x => (string)typeof(T).GetProperty(keyValue.Key).GetValue(x), keyValue.Value));

哪个没有用。

如何执行x => x.keyValue.Key替换为字符串值的keyValue.Key ,而我可以使用x => x.ClientLastName的等效x => x.ClientLastName

动态构建所需的表达式并将其传递给元组

Tuple<Expression<Func<T, object>>, SortDirection> BuildTuple<T>(KeyValuePair<string, SortDirection> keyValue) {
    var type = typeof(T);
    var propertyInfo = type.GetProperty(keyValue.Key);
    var direction = keyValue.Value;

    // T x
    var parameter = Expression.Parameter(type, "x");
    // x.Property
    var property = Expression.Property(parameter, propertyInfo);
    // T x => x.Property
    var expression = Expression.Lambda<Func<T, object>>(property, parameter);

    return new Tuple<Expression<Func<T, object>>, SortDirection>(expression, direction);
}

循环的通用版本变为

foreach (KeyValuePair<string, SortDirection> keyValue in sortItems) {
    var tuple = BuildTuple<T>(keyValue);
    tupleList.Add(tuple);
};

假设它在通用方法内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM