【问题标题】:Transforming a filter string into a C# delegate将过滤器字符串转换为 C# 委托
【发布时间】:2011-03-16 21:51:09
【问题描述】:

我有一组类用于某些客户端的数据访问层。作为数据访问的一部分,我允许以这种格式发送一组过滤器:

"{Member[.Member....]}{Operator}{Value}"

我想将这些字符串转换为委托,以便在 LINQ 查询中使用,如下所示:

.Where([delegate returned by a factory])

这是一个更具体的例子:

IEnumerable<Parent> parents = GetSomeParents();
string filter = "Child.Id=5";
var expression = FilterFactory<Parent>.GetExpression(filter);

parents = parents.Where(expression);

表达式将包含委托:parent =&gt; parent.Child.Id == 5

有没有办法使用反射以通用方式构造 FilterFactory 来处理我发送的任何成员路径?带索引的路径不是必需的,但会很好。

【问题讨论】:

    标签: c# linq parsing reflection delegates


    【解决方案1】:

    绝对是的!这也是一件非常有趣的事情。

    您可以这样做的一种方法是使用LINQ Dynamic Query Library 并获取其中的表达式编译器。我的项目MetaSharp也有类似的东西。

    但如果语法或功能与您想要的不完全匹配,您也可以自己做。一般的想法是您需要解析字符串并构建一个表示您正在解析的内容的表达式树。在 .NET 中,表达式树对象可以在 System.Linq.Expressions 中找到。一旦你有了你的树,你就可以在它上面调用 Compile() ,然后它就会被动态编译成一个委托。尝试阅读状态机和访问者模式,找出解析上述任意表达式的最佳方法。

    PS 我不建议使用正则表达式!

    【讨论】:

    • 这基本上就是我要说的。不过,让您的表达式生成器运行将需要一些试验和错误! =D
    • 动态查询库工作正常。我将它直接连接到我们的 Linq to NHibernate DAL 类中,它的播放效果相当好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    相关资源
    最近更新 更多