【问题标题】:Convert params args to a lambda expression in Entity Framework在实体框架中将参数 args 转换为 lambda 表达式
【发布时间】:2017-04-27 12:51:43
【问题描述】:

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

这样的……

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

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

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

【问题讨论】:

  • 哪里什么? thing 包含任何提供的字符串?您必须添加更多信息
  • 什么EntityFramework表达式?你都尝试了些什么?请至少提供一个minimal reproducible example
  • 这应该是一件相当简单的事情。它处理 Expression.Parameter 和 Expression.Property 等。我只是在寻找这个的实现。
  • @Jonesopolis 查询或过滤器在哪里。 Thin 来自作为模型的 DataContext。关键是 args 可能包含可以查询的事物的各种属性。所以,在这种情况下,Thing 的属性毫无意义。
  • 你可以使用 DynamicLinq 表达式

标签: c# entity-framework lambda parameters where-clause


【解决方案1】:

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

缺点是这些表达式是在运行时评估的,因此您将无法在编译时捕获错误。

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

这将是更多代码,但您将获得编译时类型检查的优势。

【讨论】:

  • 非常感谢!我会审查这些。
【解决方案2】:

一篇优秀的文章在这里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);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多