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

我需要从数据库表中获取两个字段(使用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**]}); 

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

我管理的最接近的是:

 private Func<TableData, KeyValuePair> 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).GetConstructor(new[] { typeof(DateTime), typeof(decimal) }); NewExpression constructExpression = Expression.New(constructorInfo, new ParameterExpression[] { dateParameter, fieldParameter}); var lambda = Expression.Lambda<Func<TableData, KeyValuePair>>( constructExpression, parameterExp); return lambda.Compile(); } 

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

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

有任何想法吗?

谢谢T.

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

 private Func> 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).GetConstructor(new[] { typeof(DateTime), typeof(decimal) }); NewExpression constructExpression = Expression.New(constructorInfo, new [] { dateProp, fieldProp}); var lambda = Expression.Lambda>>( constructExpression, parameterExp); return lambda.Compile(); } 

从你的问题:

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

可以使用LINQ Dynamic Query Library将LINQ查询中的字段名称指定为字符串。

您可以对任何LINQ数据提供程序使用DynamicQuery库(包括LINQ to SQL,LINQ to Objects,LINQ to XML,LINQ to Entities,LINQ to SharePoint,LINQ to TerraServer等)。 动态查询库不是使用语言运算符或类型安全的lambda扩展方法来构造LINQ查询,而是为您提供了可以将任何字符串表达式传递到的基于字符串的扩展方法。

顺便说一句,即使问题不完全相同, 答案也几乎相同。