通常,带字符串的动态linq查询可以使用替换值,例如:
result =
db.Persons.Where("Name == @1", "John");
我想要传递给Where
子句的字符串数量未知。我没有整数问题,但API似乎无法处理没有替换值的字符串。
有没有人知道解决这个问题的方法?我为Where
语句创建了一个连接字符串,所以我可以添加“@ 1”或其他什么,但我无法向Where()
添加参数,所以我被卡住了。
谢谢!
答案 0 :(得分:6)
我为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);
答案 1 :(得分:3)
我想我能看出你对字符串替换问题的意思。
以下是一些探索的替代方案。 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
答案 2 :(得分:2)
我为此做了些什么。将David Fowlers DynamicLinq项目与PredicateBuilder结合使用,您可以从Generic IQueryable构建谓词并构建它们。特别感谢StackOverflow的一些回答让我从
转换这一行Func<dynamic, dynamic>
to:
Expression<Func<T, bool>>
Implmentation ..
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的来源