ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Linq to Sql : 动态构造Expression进行动态查询

Linq to Sql : 动态构造Expression进行动态查询

原创 Linux操作系统 作者:iDotNetSpace 时间:2010-01-29 11:07:52 0 删除 编辑

    前一篇在介绍动态查询时,提到一个问题:如何根据用户的输入条件,动态构造这个过滤条件表达式呢?
Expressionbool>> predicate t => t.ProductName.Contains("che") && t.UnitPrice >= 22;

    理想情况下,我希望可以像下面这样来构造predicate,这样,我们就可以使用&、| 、&=、|=来任意拼接过滤条件了:

   1: Expressionbool>> predicate = null;
   2: predicate &= (t => t.ProductName.Contains("che")) | (t => t.UnitPrice >= 22);

    但是理想与现实之间,似乎总有不可逾越的鸿沟……

 

    前面的代码中,我们总是要写一常串Expression>,写得都有点儿烦了,我妄想自定义一个类型,这样就不用每次都写这么长了,然后再针对这个自定义类型再进行运算符重载……然后我 发现,Expression是密封类型(sealed),不给重载,没办法,只好老老实实的写,运算符重载也泡汤了。

 

   无奈之下,只好实现了下面的这种方式,勉强凑合用着:

   1: ExpressionProductExt, bool>> predicate = null;
   2: predicate = predicate.AndAlso(p => p.CompanyName.Length > 2)
   3:      .OrElse((Products p) => p.ProductName.Contains("che"))
   4:      .AndAlso((Products p) => p.UnitPrice >= 22);

    运算得到的结果如下:p => (((p.CompanyName.Length > 2) || p.ProductName.Contains("che")) && (p.UnitPrice >= 22))

    有了这个OrElse和AndAlso扩展,我们就可以对Expression>为所欲为了……

    不过跟之前文章中提到的一样,这里有个限制:虽然我们的Expression中,第一个可以凡泛型参数可以传任意值(譬如传ProductExt或 Products或其他的,可以不必要求是同一种类型),但条件中用到的对象属性(譬如CompanyName、ProductName、 UnitPrice ),必须在T中存在同名属性。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-626327/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5766190