【问题标题】:C# Linq expressions using the string value of a variable to set the column name in a lambda expressionC# Linq 表达式使用变量的字符串值在 lambda 表达式中设置列名
【发布时间】:2019-09-05 03:08:13
【问题描述】:

我有以下元组:

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 的值,而是使用实际值..

看到this answer by sstan,他在其中使用

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 =&gt; x.keyValue.Key 用它的字符串值替换keyValue.Key 并且我可以拥有x =&gt; x.ClientLastName 的等价物?

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

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

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

    假设它在一个泛型方法中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多