Я пытаюсь построить лямбда-выражение, содержащее два присваивания (как показано ниже), которые затем я могу передать методу Queryable.Select ().
Я пытаюсь передать строковую переменную в метод, а затем использовать эту переменную для построения лямбда-выражения, чтобы я мог использовать его в запросе LINQ Select.
Мое обоснование заключается в том, что у меня есть источник данных SQL Server со многими именами столбцов, я создаю приложение для построения диаграмм, которое позволит пользователю выбирать, например, вводя имя столбца, фактический столбец данных, которые они хотят вид на оси Y моего графика, где ось X всегда является датой TimeTime. Таким образом, они могут по существу выбирать, какие данные они сопоставляют со значением DateTime (это приложение типа хранилища данных).
Например, у меня есть класс для хранения извлеченных данных и, следовательно, для использования в качестве источника диаграммы:
public class AnalysisChartSource
{
public DateTime Invoicedate { get; set; }
public Decimal yValue { get; set; }
}
Я (чисто экспериментально) построил дерево выражений для предложения Where, используя значение String, и это прекрасно работает:
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 () заполнял значения X и Y класса AnalysisChartSource, например:
.Select(c => new AnalysisChartSource
{ Invoicedate = c.Invoicedate, yValue = c.yValue}).AsEnumerable();
Как, черт возьми, я могу построить такое дерево выражений ... или ... возможно, более конкретно ... ... есть более простой способ, который я упустил полностью?