动态LINQ - 是否有.NET 4版本?

Dav*_*ter 31 c# linq dynamic-linq linq-expressions

我正在寻找一些搜索例程使用LINQ,并希望有一些动态where子句.因此,例如,如果用户想要按城市搜索或按州搜索,我会有一个动态LINQ Where <>调用而不是创建两个强类型LINQ表达式,然后根据用户想要搜索的方式使用适当的LINQ表达式.

所以我想这样做:

String criteria="p.City='Pittsburgh'";  //or "p.State='PA'"
personData.Where(criteria)
Run Code Online (Sandbox Code Playgroud)

代替

personData.Where(p => p.City=="Pittsburgh");

要么

personData.Where(p => p.State=="PA");

我看到Scott Guthrie在Visual Studio 2008样本中谈论Dynamic LINQ 的博客文章.这似乎做我想要的,但我的问题是:

  1. 此示例库是否受Microsoft支持?
  2. Scott Guthrie的文章是关于VS2008(.NET 3.5)的..NET 4有更好的选择吗?也许用.NET 4发布的东西可以实现同样的东西(或者非常接近的东西)?

提前致谢!

Per*_* P. 9

你可能想看看PredicateBuilder


小智 6

这个功能真的很棒.ADO.net Datatables中存在类似的功能.这对LinqToSql也很有帮助.当然你会失去强类型检查,但这就是重点,你想要动态搜索.如果你正确处理异常我真的认为它是一个值得拥有的功能.

你可能会考虑增加一个功能请求Microsoft连接.图书馆已经存在,也许他们会考虑增加对它的官方支持.如果您确实发出了功能请求,请确保在此处发布链接,以便我们对其进行投票.Microsoft Connect具有类似于stackoverflow的投票系统.我已经提交了一些自己的LinqtoSql TableUpdateVB.net Readonly Interfaces,比如C#.

我记得在这个库中遇到了一些麻烦.我认为它与静态方法有关.

我发现开发我需要的表达式更好.Ilya Builuk的这篇文章演示了自定义表达式.关于Ilya框架的好处是它在执行像jqGrid的排序操作时删除了很多样板代码.

在了解表达式的基本概念时,我发现它非常有用.

这段代码的好处是它允许你使用点运算符作为getter.Person.Age或者如果你想违反Demeter,你甚至可以做多个吸气剂.

代码可以改进.我相信我添加了StartsWith,只允许它进行字符串操作以及其他一些搜索操作.无论它值得一看,它帮助我理解了linq表达式.

public static IQueryable<T> Where<T>(this IQueryable<T> query, string column, object value, WhereOperation operation)
{
    if (string.IsNullOrEmpty(column))
        return query;

    ParameterExpression parameter = Expression.Parameter(query.ElementType, "p");

    MemberExpression memberAccess = null;
    foreach (var property in column.Split('.'))
        memberAccess = MemberExpression.Property
           (memberAccess ?? (parameter as Expression), property);

    //change param value type
    //necessary to getting bool from string
    ConstantExpression filter = Expression.Constant
        (
            Convert.ChangeType(value, memberAccess.Type)
        );

    //switch operation
    Expression condition = null;
    LambdaExpression lambda = null;
    switch (operation)
    {
        //equal ==
        case WhereOperation.Equal:
            condition = Expression.Equal(memberAccess, filter);
            lambda = Expression.Lambda(condition, parameter);
            break;
        //not equal !=
        case WhereOperation.NotEqual:
            condition = Expression.NotEqual(memberAccess, filter);
            lambda = Expression.Lambda(condition, parameter);
            break;
        //string.Contains()
        case WhereOperation.Contains:
            condition = Expression.Call(memberAccess,
                typeof(string).GetMethod("Contains"),
                Expression.Constant(value));
            lambda = Expression.Lambda(condition, parameter);
            break;
    }


    MethodCallExpression result = Expression.Call(
           typeof(Queryable), "Where",
           new[] { query.ElementType },
           query.Expression,
           lambda);

    return query.Provider.CreateQuery<T>(result);
}
Run Code Online (Sandbox Code Playgroud)

WhereOperation枚举器:

public enum WhereOperation { Equal, NotEqual, Contains }
Run Code Online (Sandbox Code Playgroud)


Jen*_*sen 5

现在应该可以使用了。我可以通过 NuGet 下载它:http ://www.nuget.org/packages/System.Linq.Dynamic/