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

时间:2010-10-14 20:49:45

标签: c# .net linq dynamic-data

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

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

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

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

谢谢!

3 个答案:

答案 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的来源