2017-04-27 54 views
-1

我正在寻找params string [] args并将其转换为实体框架的lambda表达式。将参数args转换为实体框架中的lambda表达式

事情是这样的......

public main(params string[] args) 
{ 
    DataContext context = new DataContext(); 

    foreach(string arg in args) 
    { 
     //build Query 
    } 

    context.Things.Where(/*Query*/); 
} 
+0

哪里是什么?一个'thing'包含任何提供的字符串?您必须添加更多信息 – Jonesopolis

+0

什么样的EntityFramework表达式?你试过什么了?请至少提供[mcve]。 – MiGro

+0

这应该是一件相当简单的事情。它处理Expression.Parameter和Expression.Property等我只是寻找这个的实现。 – chrisdyck

回答

0

您可以使用动态的LINQ to创建基于字符串表达式。 https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library

缺点是这些表达式是在运行时进行评估的,所以你将无法在编译时发现错误。

或者您可以使用Expression树来构造表达式。 https://msdn.microsoft.com/en-us/library/bb882637(v=vs.110).aspx

这会多一点代码,但是你会得到编译时类型检查的好处。

+0

非常感谢你!我会审查这些。 – chrisdyck

0

一个很好的文章,这里https://www.codeproject.com/Articles/1079028/Build-Lambda-Expressions-Dynamically

这里是我的解决方案:

public static Expression<Func<TClass, bool>> ConvertParamArgsToExpression<TClass>(string[] args) 
{ 
    Expression finalExpression = Expression.Constant(true); 

    var parameter = Expression.Parameter(typeof(TClass), "x"); 

    foreach (string arg in args) { 
     string[] values = arg.Split('='); 
     PropertyInfo prop = typeof(TClass).GetProperty(values[0]); 
     if(prop != null) 
     { 
      Expression expression = null; 
      var member = Expression.Property(parameter, prop.Name); 
      var constant = Expression.Constant(values[1]); 

      expression = Expression.Equal(member, constant); 

      finalExpression = Expression.AndAlso(finalExpression, expression); 
     } 
    } 

    return (Expression.Lambda<Func<TClass, bool>>(finalExpression, parameter)); 
} 

用法:

Expression<Func<AdminPageObject, bool>> expression = LambdaConverter.ConvertParamArgsToExpression<AdminPageObject>(args); 
    if(expression != null) 
    { 
     items = items.Where(expression); 
    } 
相关问题