具有未知数量的动态Linq和替换值?

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

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

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

有没有人知道这方面的方法? 我为Where语句创建了一个连接字符串,所以我可以添加“@ 1”或其他什么,但是我不能将参数添加到Where()所以我被卡住了。

谢谢!

我为where语句创建了一个连接字符串,所以我可以添加“@ 1”或者其他什么,但是我不能将参数添加到Where()中,所以我被卡住了。

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

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

 var dic = new Dictionary { { "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); 

我想我能看出你对字符串替换问题的意思。

以下是一些探索的替代方案。 Thomas Petricek的解决方案,如果你能遵循它,那就特别有趣:

在C#中运行时构建[Dynamic] 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

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

 Func to: Expression> 

Implmentation ..

 private static Expression> GetFuncTbool(IQueryable source, Func 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>(body, parameterExpression); } 

这允许在这样的循环中“或”加入generics谓词……

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

完整的注释在这里 ,完整的演示在MvcCms.CodePlex的源头