【发布时间】:2010-04-27 08:31:40
【问题描述】:
我正在尝试构建一个 lambda 表达式,其中包含两个赋值(如下所示),然后我可以将其传递给 Queryable.Select() 方法。
我正在尝试将一个字符串变量传递给一个方法,然后使用该变量来构建 lambda 表达式,以便我可以在 LINQ Select 查询中使用它。
我的理由是我有一个包含许多列名的 SQL Server 数据源,我正在创建一个图表应用程序,它允许用户选择,比如通过输入列名,他们想要的实际数据列在图表的 y 轴上查看,x 轴始终是 DateTime。因此,他们基本上可以选择根据 DateTime 值绘制哪些数据(这是一个数据仓库类型的应用程序)。
例如,我有一个类来存储检索到的数据,因此用作以下图表源:
public class AnalysisChartSource
{
public DateTime Invoicedate { get; set; }
public Decimal yValue { get; set; }
}
我已经(纯粹是实验性的)使用字符串值为 Where 子句构建了一个表达式树,并且效果很好:
public void GetData(String yAxis)
{
using (DataClasses1DataContext db = new DataClasses1DataContext())
{
var data = this.FunctionOne().AsQueryable<AnalysisChartSource>();
//just to get some temp data in....
ParameterExpression pe = Expression.Parameter(typeof(AnalysisChartSource), "p");
Expression left = Expression.MakeMemberAccess(pe,
typeof(AnalysisChartSource).GetProperty(yAxis));
Expression right = Expression.Constant((Decimal)16);
Expression e2 = Expression.LessThan(left, right);
Expression expNew = Expression.New(typeof(AnalysisChartSource));
LambdaExpression le = Expression.Lambda(left, pe);
MethodCallExpression whereCall = Expression.Call(
typeof(Queryable), "Where", new Type[] { data.ElementType },
data.Expression,
Expression.Lambda<Func<AnalysisChartSource, bool>>(e2, new ParameterExpression[] { pe }));
}
}
但是……我已经为 Select 语句尝试了类似的方法,但无法让它工作,因为我需要 Select() 来填充 AnalysisChartSource 类的 X 和 Y 值,如下所示:
.Select(c => new AnalysisChartSource
{ Invoicedate = c.Invoicedate, yValue = c.yValue}).AsEnumerable();
我到底如何才能构建这样一个表达式树......或者......可能更重要......有没有更简单的方法我完全错过了?
【问题讨论】:
标签: c# lambda expression-trees