2013-04-11 5 views
0

Попытка создать следующее выражение с помощью деревьев выражений (хотел бы помочь)Не удается построить лямбда-выражение дерева

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

+2

Какие ошибки времени выполнения? – Alxandr

+0

Не смотря далее, я вижу, что 'param.GetType(). GetProperty (" LabelName ");' неправильный - вы, вероятно, хотите 'typeof (dt_label)' здесь. –

+1

Зачем вам нужны деревья выражений? – svick

ответ

3

Эта линия является проблемой

var key = param.GetType().GetProperty("LabelName"); 

param.GetType() собирается вернуть System.Linq.Expressions.ParameterExpression, у которого нет LabelName.

Вы должны использовать typeof(dt_Label).GetProperty("LabelName")

+0

вместо: var key = param.GetType(). GetProperty ("LabelName"); Я попытался: var key = param.Type.GetField ("LabelName"); но ключ получает нуль, почему? – aura

+0

и что я пытаюсь получить: dt_Label.LabelName – aura

+0

Затем попробуйте 'typeof (dt_Label) .GetProperty (" LabelName ")'. Я мог ошибаться в вопросе 'param.Type' –

Смежные вопросы