博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# Expression 扩展
阅读量:5885 次
发布时间:2019-06-19

本文共 2321 字,大约阅读时间需要 7 分钟。

一、简介

当查询比较复杂时,需要很多判断或者跨方法传递参数时使用

二、扩展类

///     ///     Expression表达式扩展操作类    /// 调用方法:repository.GetAll().AsExpandable().Where(predicate)    ///     public static class ExpressionExtensions    {         ///         ///     以特定的条件运行组合两个Expression表达式        ///         /// 
表达式的主实体类型
/// 第一个Expression表达式 /// 要组合的Expression表达式 /// 组合条件运算方式 ///
组合后的表达式
public static Expression
Compose
(this Expression
first, Expression
second, Func
merge) { var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f); var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body); return Expression.Lambda
(merge(first.Body, secondBody), first.Parameters); } ///
/// 以 Expression.AndAlso 组合两个Expression表达式 /// ///
表达式的主实体类型
///
第一个Expression表达式 ///
要组合的Expression表达式 ///
组合后的表达式
public static Expression
> And
(this Expression
> first, Expression
> second) { return first.Compose(second, Expression.AndAlso); } ///
/// 以 Expression.OrElse 组合两个Expression表达式 /// ///
表达式的主实体类型
///
第一个Expression表达式 ///
要组合的Expression表达式 ///
组合后的表达式
public static Expression
> Or
(this Expression
> first, Expression
> second) { return first.Compose(second, Expression.OrElse); } private class ParameterRebinder : ExpressionVisitor { private readonly Dictionary
_map; private ParameterRebinder(Dictionary
map) { _map = map ?? new Dictionary
(); } public static Expression ReplaceParameters(Dictionary
map, Expression exp) { return new ParameterRebinder(map).Visit(exp); } protected override Expression VisitParameter(ParameterExpression node) { ParameterExpression replacement; if (_map.TryGetValue(node, out replacement)) node = replacement; return base.VisitParameter(node); } } }

 

三、如何使用

1.关于引用

using System.Linq;

using System.Linq.Expressions;

using LinqKit;

还需要引入扩展类的命名空间

2.使用示例

Expression
> pre; pre = s => s.NickName.Contains("李"); pre = pre.Or(s => s.NickName.Contains("陈")); pre = pre.And(s => s.CompanyId == "1"); var data = _userRepository.GetAll().AsExpandable().Where(pre);

 

转载地址:http://lulix.baihongyu.com/

你可能感兴趣的文章
软件工程敏捷开发04
查看>>
Practise Site Home Sample Page Codes de carte cadeau Amazon | Codes Promo Amazon
查看>>
linux c下输入密码不回显
查看>>
在Linux命令行下发送html格式的邮件
查看>>
说说PHP中foreach引用的一个坑
查看>>
基于express框架的应用程序骨架生成器介绍
查看>>
Spring学习11-Spring使用proxool连接池 管理数据源
查看>>
2016第6周五
查看>>
ASP.NET 免费开源控件
查看>>
面向对象葵花宝典阅读思维导图(二)
查看>>
volatile关键字与线程间通信
查看>>
优秀大数据GitHub项目一览
查看>>
TCP/IP详解学习笔记(8)-DNS域名系统
查看>>
通过维基API实现维基百科查询功能
查看>>
bootstrap 2
查看>>
Annotation研究的一些学习资料
查看>>
webpack资料
查看>>
DotNet加密方式解析--散列加密
查看>>
OpenSSL使用2(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12概念说明)(转)
查看>>
【前端】:HTML
查看>>