【问题标题】:Dynamic Linq and substitution values with unknown number?动态 Linq 和未知数字的替换值?
【发布时间】:2010-10-14 20:49:44
【问题描述】:

通常,带有字符串的动态 linq 查询可以使用替换值,例如:

result =
    db.Persons.Where("Name == @1", "John");

我想要传递给Where 子句的字符串数量未知。我对整数没有问题,但 API 似乎无法处理没有替换值的字符串。

有人知道解决这个问题的方法吗?我为Where 语句创建了一个连接字符串,因此我可以添加“@1”或其他任何内容,但我无法向Where() 添加参数,所以我被卡住了。

谢谢!

【问题讨论】:

    标签: c# .net linq dynamic-data


    【解决方案1】:

    我为 where 语句创建了一个连接字符串,因此我可以添加“@1”或其他任何内容,但我无法向 Where() 添加参数,所以我被卡住了。

    是的,你可以。 Where 方法的第二个参数是params object[] values,所以你只需要传递一个对象数组。

    例如,假设您在字典中有属性名称和值,您可以执行以下操作:

    var dic = new Dictionary<string, object>
    {
        { "Name", "John" },
        { "Age", 30 },
        { "City", "New York" }
    };
    
    ...
    
    var conditions = dic.Keys.Select(
        (key, idx) =>
            string.Format("{0} == @{1}", key, idx));
    string predicate = string.Join(" And ", conditions);
    object[] values = dic.Values.ToArray();
    result = db.Persons.Where(predicate, values);
    

    【讨论】:

      【解决方案2】:

      我想我明白你对字符串替换问题的意思了。

      这里有几个可供探索的替代方案。 Thomas Petricek 的解决方案,如果你能遵循的话,特别有趣:

      在 C# 运行时构建 [动态] LINQ 查询
      http://tomasp.net/articles/dynamic-linq-queries.aspx

      使用 PredicateBuilder 动态组合表达式谓词
      http://www.albahari.com/nutshell/predicatebuilder.aspx


      另见http://blogs.msdn.com/b/mattwar/archive/2006/05/10/594966.aspx

      【讨论】:

      • 认真的吗?在 2011 年,这是最好的条件吗?哦,lulz,好吧,albahari 至少看起来可以理解。我认为现在肯定会有比这更好的东西。
      【解决方案3】:

      我为此做了一些东西。将 David Fowlers DynamicLinq 项目与 PredicateBuilder 结合使用,您可以从 Generic IQueryable 构建谓词并构建它们。特别感谢一些 StackOverflow 的回答,它给了我这一行来转换

      Func<dynamic, dynamic>
      
      to:
      
      Expression<Func<T, bool>>
      

      实施..

      private static Expression<Func<T, bool>> GetFuncTbool<T>(IQueryable source, Func<dynamic, dynamic> expressionBuilder)
      {
          ParameterExpression parameterExpression = Expression.Parameter(GetElementType(source), expressionBuilder.Method.GetParameters()[0].Name);
          DynamicExpressionBuilder dynamicExpression = expressionBuilder(new DynamicExpressionBuilder(parameterExpression));
      
          Expression body = dynamicExpression.Expression;
          return Expression.Lambda<Func<T, bool>>(body, parameterExpression);
      }
      

      这允许“或”在这样的循环中加入泛型谓词...

      predicateToAdd = query.DynamicWhereForPredicateBuilder(z => z[columnName].Contains(dataTablesRequest.sSearch)); //contains or
      

      完整的文章是here,完整的演示在源代码MvcCms.CodePlex

      【讨论】:

        猜你喜欢
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        • 2012-08-13
        • 2018-09-15
        • 1970-01-01
        • 2015-09-09
        • 2021-05-03
        • 1970-01-01
        相关资源
        最近更新 更多