有一个字符串"p=>p.id==1"
怎么把它转成(p=>p.id==1)表达式使它能够用在下面First参数里?
mObjectContext.table1.First(p => p.id == 1).spec = "TEST";

解决方案 »

  1.   

    这涉及到动态编译吧。目前.net 3.5类库只支持到c#2.0
    但是vs2010支持C#4.0,耐心等待吧
      

  2.   

    动态编译,动态查询都不支持。还有其它的办法吗?感觉目前的.NET太不成熟了。
      

  3.   

    这个问题分2个步骤,第一个步骤是把C#语法解析成CodeDOM的表达式,第二个步骤是把CodeDOM的表达式转成lambda表达式。
    第一个步骤目前微软没有提供任何C#语法解析工具,只有个编译成IL的编译器,所以需要自己写一个能解析C#3.0语法的解析器来解析新的lambda表达式。
    至于第二个步骤就很简单了,如果有了Code表达式那转换成lambda表达式就是体力活了。
    至于你这个例子,给个简单的转换lambda表达式的示例://p=>p==1; 假设p的类型为T
    ParameterExpression param = Expression.Parameter(typeof(T), "p");
    LambdaExpression lamda = Expression.Lambda(Expression.Equal(Expression.Field(param, "id"), Expression.Constant(1)), param);
    mObjectContext.table1.First((Func<int, bool>)lamda.Compile()).spec = "TEST";对这种很简单的动态lambda,第一步可以不需要做一个完整的parser,做个简单的词法及表达式字符串解析工具就行了。
      

  4.   

    mObjectContext.table1.First((Func <int, bool>)lamda.Compile()).spec = "TEST"; 编译通不过,提示错误:
    错误 8 无法从用法中推导出方法“System.Linq.Queryable.First<TSource>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,bool>>)”的类型实参。请尝试显式指定类型实参。               
      

  5.   

    这个目前是不可能的
    到c#4估计就可以了
    提前安装vs2010吧
      

  6.   

    mObjectContext.table1.First((Func <int, bool>)lamda.Compile()).spec = "TEST"; 这里手误,应该是mObjectContext.table1.First((Func <T, bool>)lamda.Compile()).spec = "TEST"; 
      

  7.   

    To:guoyichao 
      这样还是必须Func<T,bool>输入T这个类型,而不能用字符串替代
      

  8.   

    To:ojlovecd 
      周未研究出来了告诉我一下
      

  9.   

    我觉得,你不一定要把字符串转成lambda表达式,
    传入First里面的其实应该是一个委托,试试传入这个东西:
    new Fun<p的类型,bool>(p => p.id == 1)
      

  10.   

    To:ojlovecd 
      因为只知道它的类型名称(字符串)
    就是p的类型只知道它的类型名称(字符串)
    new Fun <p的类型,bool>(p => p.id == 1)
    不知道怎么将字符串转成类型
      

  11.   


    为了能使用Queryable的那些强类型扩展方法,在编译时类型必须是要明确的,如果真要让查询支持动态类型,那就自己给Queryable写一套弱类型的扩展方法。