Я пытаюсь создать лямбда-выражение, содержа два присвоения (как показано далее вниз), который я могу затем передать Queryable. Выберите () метод.
Я пытаюсь передать строковую переменную в метод и затем использовать ту переменную для создания лямбда-выражения так, чтобы я мог использовать его в Запросе Select LINQ.
Мое обоснование позади него состоит в том, что у меня есть источник данных 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, но просто не могу заставить его работать, поскольку мне нужен Выбор () для заполнения обоих значений X и Y класса AnalysisChartSource, как это:
.Select(c => new AnalysisChartSource
{ Invoicedate = c.Invoicedate, yValue = c.yValue}).AsEnumerable();
Как же я могу создать такое дерево выражений … .or … .possibly главный ….. существует ли более легкий способ, которым я отсутствовал полностью?
Я считаю, что лучший способ понять, как строить деревья выражений, - это посмотреть, что делает компилятор C #. Итак, вот полная программа:
using System;
using System.Linq.Expressions;
public class Foo
{
public int X { get; set; }
public int Y { get; set; }
}
class Test
{
static void Main()
{
Expression<Func<int, Foo>> builder =
z => new Foo { X = z, Y = z };
}
}
Скомпилируйте ее, откройте результаты в Reflector и установите оптимизацию на .NET 2.0. В итоге вы получаете сгенерированный код для метода Main:
ParameterExpression expression2;
Expression<Func<int, Foo>> expression =
Expression.Lambda<Func<int, Foo>>(
Expression.MemberInit(
Expression.New((ConstructorInfo) methodof(Foo..ctor), new Expression[0]),
new MemberBinding[] { Expression.Bind((MethodInfo) methodof(Foo.set_X),
expression2 = Expression.Parameter(typeof(int), "z")),
Expression.Bind((MethodInfo) methodof(Foo.set_Y),
expression2) }
),
new ParameterExpression[] { expression2 });
В принципе, я думаю, что Expression.MemberInit
- это то, что вам нужно.