专栏首页菩提树下的杨过linq to sql的多条件动态查询(下)

linq to sql的多条件动态查询(下)

借助老外写的一个扩展表达式的类,可以把上篇中的代码写得更优雅

这是PredicateBuilder的源文件

public static class PredicateBuilder
    {
      public static Expression<Func<T, bool>> True<T> ()  { return f => true;  }
      public static Expression<Func<T, bool>> False<T> () { return f => false; }
     
      public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
                                                          Expression<Func<T, bool>> expr2)
      {
        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
        return Expression.Lambda<Func<T, bool>>
              (Expression.Or (expr1.Body, invokedExpr), expr1.Parameters);
      }
     
      public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
                                                           Expression<Func<T, bool>> expr2)
      {
        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
        return Expression.Lambda<Func<T, bool>>
              (Expression.And (expr1.Body, invokedExpr), expr1.Parameters);
      }
    }

下面是使用示例 :

public static class PredicateBuilder
    {
      public static Expression<Func<T, bool>> True<T> ()  { return f => true;  }
      public static Expression<Func<T, bool>> False<T> () { return f => false; }
     
      public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
                                                          Expression<Func<T, bool>> expr2)
      {
        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
        return Expression.Lambda<Func<T, bool>>
              (Expression.Or (expr1.Body, invokedExpr), expr1.Parameters);
      }
     
      public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
                                                           Expression<Func<T, bool>> expr2)
      {
        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
        return Expression.Lambda<Func<T, bool>>
              (Expression.And (expr1.Body, invokedExpr), expr1.Parameters);
      }
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Asp.Net Mvc中的一些初级问题整理

    1.如何让Controller不返回视图?(比如仅执行一些数据库操作) 很简单,只要在Controller中定义一个void类型的public方法即可 publ...

    菩提树下的杨过
  • ruby学习笔记(6)-Array的使用

    ruby的数组基本使用,跟c#中的数组比起来,最不习惯的区别在于允许负索引(跟javascript到有几分相似) arr=[3,4,5,6,7,8,9] pu...

    菩提树下的杨过
  • ArraySegment<T>泛型结构示例

    以下代码利用ArrarSegment泛型结构,从int数组arr中取出arr[2]到arr[5] using System; using System.Col...

    菩提树下的杨过
  • tensorflow入门:CNN for MNIST

    使用tensorflow构建如上图所示的CNN用于对MNIST数据集进行softmax classification。

    Steve Wang
  • 设计模式-PHP实现单件模式的几种方式

    单件模式是我们在开发中经常用到的一种设计模式,利用PHP5面向对象的特性,我们可以很容易的构建单件模式的应用,下面是单件模式在PHP中的几种实现方法:

    大江小浪
  • C#中汉字排序简单示例(拼音/笔划)

    跟着阿笨一起玩NET
  • express的application.js里的路由代码

    application.js是express框架的核心,也是里面包括了服务端的很多配置和逻辑代码。这里主要说一下和路由有关的一些代码。

    theanarkh
  • 寻求互绑公众号-思维导图Nodes小程序

    作为首个可视化思维导图创作小程序,Nodes目前已累积3万+用户,为更好地服务,现公开对外征集互绑公众号伙伴,有意可留言或联系微信 minijoe,或在mp后台...

    花叔
  • 用大白话告诉你什么是低耦合|高内聚

            首先我们来看看内聚的含义:软件含义上的内聚其实是从化学中的分子的内聚演变过来的,化学中的分子间的作用力,作用力强则表现为内聚程度高。在软件中内聚...

    不会飞的小鸟
  • 升级 微信技术输出 时尚新门店尝鲜刷脸支付

    北京商报讯(记者 吴文治 魏茹)腾讯加快面向零售业开放的步伐,最典型的动作就是将微信支付技术对外输出。12月26日,微信支付、腾讯社交广告与绫致时装集团宣布达成...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券