Попытка создать следующее выражение с помощью деревьев выражений (хотел бы помочь)Не удается построить лямбда-выражение дерева
List<string> lstName = dt_Name.Select(y => y.Name);
List<string> lstLabName = dt_Label.Select(x => x.LabelName).Where(p => p.LabelName.StartsWith(lstName + '_'));
Я хотел бы, чтобы на самом деле идти по всем lstName и найти все экземпляры в lstLabName, что выполнить условие.
кода я придумал до сих пор:
private BinaryExpression CreateBinaryExpression(string buildName)
{
// x.LabelName
var param = Expression.Parameter(typeof(dt_Label), "x");
var key = param.GetType().GetProperty("LabelName");
var left = Expression.MakeMemberAccess(param, key);
//ParameterExpression left = Expression.Parameter(typeof(string), "p"); //p
ConstantExpression constantExpression = Expression.Constant(buildName, typeof(string));
// x.LabelName == buildName
return Expression.MakeBinary(ExpressionType.Equal, left, constantExpression);
}
private BinaryExpression CalculateLambdaExp(List<string> lstBuildName)
{
BinaryExpression binaryExpression = CreateBinaryExpression(lstBuildName[0]);
if (lstBuildName.Count() > 1)
{
List<string> lstnStr = lstBuildName;
lstnStr.RemoveAt(0);
BinaryExpression calculatedLambdaExp = CalculateLambdaExp(lstnStr);
binaryExpression = Expression.MakeBinary(ExpressionType.AndAlso, binaryExpression, calculatedLambdaExp);
}
return binaryExpression;
}
private List<string> RunLambdaExpression(List<string> BuildName)
{
ParameterExpression left = Expression.Parameter(typeof(string), "p"); //p
var factorial = Expression.Lambda<Func<List<string>, List<string>>>(CalculateLambdaExp(BuildName), left);
var n = factorial.Compile()(BuildName);
List<string> lst = n.ToList();
return lst;
}
Я получаю много ошибок во время выполнения. был бы признателен за любую помощь.
понял большинство из них из:
изменили функцию CreateBinaryExpression на:
private Expression CreateBinaryExpression(string buildName)
{
// x.LabelName
var param = Expression.Parameter(typeof(dt_Label), "x");
var key = typeof(dt_Label).GetProperty("LabelName");
var left = Expression.MakeMemberAccess(param, key);
ConstantExpression constantExpression = Expression.Constant(buildName + '_', typeof(string));
//x.LabelName.startsWith(buildName_)
MethodInfo mi = typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) });
Expression call = Expression.Call(left, mi, constantExpression);
return call;
};
и изменили все ссылки на функции получить выражение вместо BinaryExpression
Какие ошибки времени выполнения? – Alxandr
Не смотря далее, я вижу, что 'param.GetType(). GetProperty (" LabelName ");' неправильный - вы, вероятно, хотите 'typeof (dt_label)' здесь. –
Зачем вам нужны деревья выражений? – svick