using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;namespace WuZiFenGongSiInfomation.Common
{/// <summary>/// Lambda表达式拼接扩展类/// </summary>/// https://blogs.msdn.microsoft.com/meek/2008/05/02/linq-to-entities-combining-predicates//// http://www.albahari.com/nutshell/predicatebuilder.aspxpublic static class ExpressionUtility{/// <summary>/// Lambda表达式拼接/// </summary>/// <typeparam name="T"></typeparam>/// <param name="first"></param>/// <param name="second"></param>/// <param name="merge"></param>/// <returns></returns>public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge){// build parameter map (from parameters of second to parameters of first)var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);// replace parameters in the second lambda expression with parameters from the firstvar secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);// apply composition of lambda expression bodies to parameters from the first expression return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);}/// <summary>/// and扩展/// </summary>/// <typeparam name="T"></typeparam>/// <param name="first"></param>/// <param name="second"></param>/// <returns></returns>public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second){return first.Compose(second, Expression.And);}/// <summary>/// or扩展/// </summary>/// <typeparam name="T"></typeparam>/// <param name="first"></param>/// <param name="second"></param>/// <returns></returns>public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second){return first.Compose(second, Expression.Or);}}/// <summary>/// /// </summary>public class ParameterRebinder : ExpressionVisitor{private readonly Dictionary<ParameterExpression, ParameterExpression> map;/// <summary>/// /// </summary>/// <param name="map"></param>public ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map){this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();}/// <summary>/// /// </summary>/// <param name="map"></param>/// <param name="exp"></param>/// <returns></returns>public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp){return new ParameterRebinder(map).Visit(exp);}/// <summary>/// /// </summary>/// <param name="p"></param>/// <returns></returns>protected override Expression VisitParameter(ParameterExpression p){ParameterExpression replacement;if (map.TryGetValue(p, out replacement)){p = replacement;}return base.VisitParameter(p);}}
}

初始化Expression<Func<T, bool>>,参考代码:

Expression<Func<ArticleWhere, bool>> express= g=>true;

//拼接条件

if (!string.IsNullOrEmpty(where?.ChannelId))
 {
        express = express.And(x => x.ChannelId == where.ChannelId);
 }

转载自:

https://blog.csdn.net/shujudeliu/article/details/84314642

Expression拼接条件,Expression.And相关推荐

  1. Expression 拼接组合表达式(附--封装代码)

    参考:https://www.cnblogs.com/wzxinchen/p/4611592.html,最后加了点额外的东西 前言 LINQ大家都知道,用起来也还不错,但有一个问题,当你用Linq进行 ...

  2. Mybatis的动态拼接条件

    官网的例子永远是最好的,切记切记!! 拼接条件 <sql id="select_asset_where"><if test="accountType ! ...

  3. tkMapper之使用Weekend拼接条件进行条件查询

    tkMapper之使用Weekend拼接条件进行条件查询 0. 引入 1. andEqualTo 2. andIn 3. andNotEqualTo 4. andNotIn 5. andGreater ...

  4. Spring Data JPA 动态拼接条件的通用设计模式

    记住官方文档永远是首选 import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import jav ...

  5. shell-脚本入门

    http://www.blogjava.net/liubowu/archive/2007/06/25/99317.html 1 Shell环境设置 1.1 登陆欢迎信息 终端机接口 (tty1 ~ t ...

  6. c# 经验谈:巧用Expression表达式 解决类似于sql中 select in 的查询(适合于中小型项目)...

    我们在项目经常会碰到一些特殊需求 例如下拉框是复选的,查询条件是根据下拉框中复选项进行拼接 看到此图后大家肯定会说,这很简单嘛 将所有的选项 拼成"'1-3','5-9'"  然后 ...

  7. EntityFramework4.5使用Expression类创建动态查询及动态查询导航属性

    创建动态查询 想在项目中实现一个灵活的动态查询类,参考http://www.cnblogs.com/lyj/archive/2008/03/25/1122157.html和http://www.cnb ...

  8. ABP +VUE Elment 通用高级查询(右键菜单)设计+LINQ通用类Expression<Func<TFields, bool>>方法

    ABP +VUE Elment 通用高级查询(右键菜单)设计+LINQ通用类Expression 1. 目前需要用VUE实现源cs系统报表的右键菜单所有和自定义查询功能. 1.1 CS端的右键菜单效果 ...

  9. 创建Expression表达式树动态查询

    EFCore 使用反射 根据实体的属性动态生成Expression进行查询 EFCore 的查询语法是: Expression<Func<T,bool>> condition ...

最新文章

  1. nodejs安装及环境配置(windows系统)
  2. C#中String对象转换为Font对象的方法
  3. 作为面试官的一点小感想
  4. 动态改变select 宽度
  5. React上下文-Context
  6. 4到20ma模拟量转换公式_西门子 S7-1200 模拟量转换
  7. 使用自己的数据集训练MobileNet、ResNet实现图像分类(TensorFlow)
  8. Linux进阶之路————磁盘查询
  9. react map循环生成的button_常见 React 面试题
  10. python安装与开发环境搭建实验总结_python开发环境安装配置
  11. linux抓包操作,linux/windows常用抓包分析操作
  12. java名字转化为拼音_将中文姓名转换为拼音
  13. 安卓的用户实时预览Figma设计稿的方法
  14. 用js获取ios时间戳,结果为NaN或不显示
  15. android jnl的mk文件,动态语言与静态语言
  16. Swagger (YAML OpenAPI) 从放弃到入门
  17. 啊哈C——学习4.4一起来找茬
  18. 开源企业软件采购指南
  19. java程序纠错题_面试题错题本之java
  20. MCDF验证学习笔记

热门文章

  1. adb命令 (安装apk包格式:adb install 电脑上apk地址包名)
  2. python游戏飞船与外星人代码
  3. linux系统支持游戏,2017 年 30 款最好的支持 Linux 的 Steam 游戏
  4. 常见的几种web攻击方式及原理
  5. 小哈机器人新年照片_六位明星新年照片,baby灵气十足,千玺帅哭了,迪丽热巴却加特效!...
  6. 测试报告模板范例 原创
  7. android Button按下及抬起监听事件
  8. DDD-经典四层架构应用
  9. python xlsx读写_Python Excel文件的读写操作(xlwt xlrd xlsxwriter)
  10. 【Rust日报】 2019-05-27:toast - 支持在docker容器中运行任务的工具