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)
在这种情况下,我知道实体 - "Client" 并且您正在使用 "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 是客户端并且 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
的等价物?
动态构建所需的表达式并将其传递给元组
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);
};
假设它在泛型方法中。
我有以下元组:
Tuple<Expression<Func<Client, object>>, SortOrder>(x => x.ClientLastName, SortOrder.Descending)
在这种情况下,我知道实体 - "Client" 并且您正在使用 "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 是客户端并且 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
的等价物?
动态构建所需的表达式并将其传递给元组
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);
};
假设它在泛型方法中。