使用Lambda表达式从字段名称中选择不同的字段

Tob*_*ush 7 c# asp.net lambda expression linq-to-sql

我需要从数据库表中获取两个字段(使用linq-to-sql检索),一个字段是日期时间(并且是固定字段),另一个字段始终是小数,但字段可以不同.

该表包含每天处理两次且以不同货币处理的货币数据,因此可能包含AM_USD,PM_USD,AM_EUR等字段.我需要获取数据,例如针对PM_USD的日期列表或针对AM_EUR的日期.

我希望能够使用lambda表达式调用数据(例如,这是一个剥离的示例):

data = TableData.Select(x=>new {x.DateTimeAdded, x.[**field name as string**]});
Run Code Online (Sandbox Code Playgroud)

我一直试图写一个函数来做到这一点,并且失败了.

我管理的最接近的是:

private Func<TableData, KeyValuePair<DateTime, decimal>> CreateSelect(string FieldName)
{
    var parameterExp = Expression.Parameter(typeof(TableData), "sel");
    var dateParameter = Expression.Parameter(typeof(DateTime), "DateTimeAdded");
    var fieldParameter = Expression.Parameter(typeof(decimal), FieldName);
    ConstructorInfo constructorInfo = typeof(KeyValuePair<DateTime, decimal>).GetConstructor(new[] { typeof(DateTime), typeof(decimal) });
    NewExpression constructExpression = Expression.New(constructorInfo, new ParameterExpression[] { dateParameter, fieldParameter});

    var lambda = Expression.Lambda<Func<TableData, KeyValuePair<DateTime, decimal>>>( constructExpression, parameterExp);

    return lambda.Compile();
}
Run Code Online (Sandbox Code Playgroud)

其中"System.InvalidOperationException:Lambda参数不在范围内"失败.

我确定我错过了一些明显的东西,或者错误的方式.

有任何想法吗?

谢谢T

Mar*_*ell 4

x.Foo是(属性或字段)的成员x,而不是参数:

private Func<TableData, KeyValuePair<DateTime, decimal>> CreateSelect(string FieldName)
{
    var parameterExp = Expression.Parameter(typeof(TableData), "sel");
    var dateProp = Expression.PropertyOrField(parameterExp, "DateTimeAdded"); 
    var fieldProp = Expression.PropertyOrField(parameterExp, FieldName);
    ConstructorInfo constructorInfo = typeof(KeyValuePair<DateTime, decimal>).GetConstructor(new[] { typeof(DateTime), typeof(decimal) });
    NewExpression constructExpression = Expression.New(constructorInfo, new [] { dateProp, fieldProp});

    var lambda = Expression.Lambda<Func<TableData, KeyValuePair<DateTime, decimal>>>( constructExpression, parameterExp);

    return lambda.Compile();
}
Run Code Online (Sandbox Code Playgroud)