本篇介绍的表达式生成器,用于动态创建表达式。

  在Util项目Lambdas目录中,添加ExpressionBuilder,代码如下。

using System;
using System.Linq.Expressions; namespace Util.Lambdas {
/// <summary>
/// 表达式生成器
/// </summary>
public class ExpressionBuilder<TEntity> {
/// <summary>
/// 初始化表达式生成器
/// </summary>
public ExpressionBuilder() {
Parameter = Expression.Parameter( typeof( TEntity ), "t" );
} /// <summary>
/// 参数
/// </summary>
private ParameterExpression Parameter { get; set; } /// <summary>
/// 获取参数
/// </summary>
public ParameterExpression GetParameter() {
return Parameter;
} /// <summary>
/// 创建表达式
/// </summary>
/// <param name="property">属性表达式</param>
/// <param name="operator">运算符</param>
/// <param name="value">值</param>
public Expression Create<T>( Expression<Func<TEntity, T>> property, Operator @operator, object value ) {
return Parameter.Property( Lambda.GetMember( property ) ).Operation( @operator, value );
} /// <summary>
/// 转换为Lambda表达式
/// </summary>
/// <param name="expression">表达式</param>
public Expression<Func<TEntity, bool>> ToLambda( Expression expression ) {
if ( expression == null )
return null;
return expression.ToLambda<Func<TEntity, bool>>( Parameter );
}
}
}

  在Util.Tests测试项目中,添加ExpressionBuilderTest单元测试,代码如下。

using System;
using System.Linq.Expressions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Util.Lambdas;
using Util.Tests.Samples; namespace Util.Tests {
/// <summary>
/// 测试表达式生成器
/// </summary>
[TestClass]
public class ExpressionBuilderTest {
/// <summary>
/// 表达式生成器
/// </summary>
ExpressionBuilder<Test2> _builder; /// <summary>
/// 测试初始化
/// </summary>
[TestInitialize]
public void TestInit() {
_builder = new ExpressionBuilder<Test2>();
} /// <summary>
/// 创建表达式
/// </summary>
[TestMethod]
public void TestCreate_Int() {
Expression<Func<Test2, int>> property = t => t.Int;
var expression = _builder.Create( property, Operator.Equal, );
Expression<Func<Test2, bool>> expected = t => t.Int == ;
Assert.AreEqual( expected.ToString(), _builder.ToLambda( expression ).ToString() );
} /// <summary>
/// 创建表达式
/// </summary>
[TestMethod]
public void TestCreate_Int_Nullable() {
Expression<Func<Test2, int?>> property = t => t.NullableInt;
var expression = _builder.Create( property, Operator.Equal, );
Assert.AreEqual( "t => (t.NullableInt == 1)", _builder.ToLambda( expression ).ToString() );
}
}
}

  由于目前的功能比较简单,所以只添加了两个方法,后面需要的时候再扩展。

  准备工作已经就绪,下一篇可以介绍查询条件及日期范围、数值范围条件封装。

  .Net应用程序框架交流QQ群: 386092459,欢迎有兴趣的朋友加入讨论。

  谢谢大家的持续关注,我的博客地址:http://www.cnblogs.com/xiadao521/

  下载地址:http://files.cnblogs.com/xiadao521/Util.2015.1.6.1.rar

Util应用程序框架公共操作类(十一):表达式生成器的更多相关文章

  1. Util应用程序框架公共操作类

    随笔分类 - Util应用程序框架公共操作类 Util应用程序框架公共操作类 Util应用程序框架公共操作类(五):异常公共操作类 摘要: 任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务 ...

  2. Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)

    今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...

  3. Util应用程序框架公共操作类(七):Lambda表达式公共操作类

    前一篇扩展了两个常用验证方法,本文将封装两个Lambda表达式操作,用来为下一篇的查询扩展服务. Lambda表达式是一种简洁的匿名函数语法,可以用它将方法作为委托参数传递.在Linq中,大量使用La ...

  4. Util应用程序框架公共操作类(二):数据类型转换公共操作类(源码篇)

    上一篇介绍了数据类型转换的一些情况,可以看出,如果不进行封装,有可能导致比较混乱的代码.本文通过TDD方式把数据类型转换公共操作类开发出来,并提供源码下载. 我们在 应用程序框架实战十一:创建VS解决 ...

  5. Util应用程序框架公共操作类(九):Lambda表达式扩展

    上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展. 修改Util项目的Extensions.Expression.cs文件,代码如下. using Sy ...

  6. Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)

    前面介绍了查询的基础扩展,下面准备给大家介绍一些有用的查询封装手法,比如对日期范围查询,数值范围查询的封装等,为了支持这些功能,需要增强公共操作类. Lambda表达式公共操作类,我在前面已经简单介绍 ...

  7. Util应用程序框架公共操作类(六):验证扩展

    前面介绍了仓储的基本操作,下面准备开始扩展查询,在扩展查询之前,首先要增加两个公共操作类,一个是经常要用到的验证方法,另一个是Lambda表达式的操作类. 很多时候,我们会判断一个对象是否为null, ...

  8. Util应用程序框架公共操作类(五):异常公共操作类

    任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务上的错误进行简单支持. 对于刚刚接触.Net的新手,碰到错误的时候,一般喜欢通过返回bool值的方式指示是否执行成功. public boo ...

  9. Util应用程序框架公共操作类(四):验证公共操作类

    为了能够验证领域实体,需要一个验证公共操作类来提供支持.由于我将使用企业库(Enterprise Library)的验证组件来完成这项任务,所以本文也将演示对第三方框架的封装要点. .Net提供了一个 ...

随机推荐

  1. 解决nginx中proxy_pass到tomcat的session丢失问题

    之前在配置tomcat的时候都是一个项目对应一个tomcat,也就是一个端口.最近需要把两个项目整合到同一个tomcat中,通过配置nginx让两个域名指向同一tomcat的不同项目.整合完毕后发现其 ...

  2. 移动web前端下拉刷新效果

    直接复制粘贴 放在页面中即可 <script> window.onload = function(){ window.addEventListener('touchstart', touc ...

  3. Cloud Engine:大杀器如何炼成

    郑昀(微博:http://weibo.com/yunzheng) 创建于2016/6/18 最后更新于2016/6/19 点击查看我的<如何从零搭建一个技术平台>,这是一个系列.转载时请注 ...

  4. 【hihoCoder】1288 : Font Size

    题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...

  5. (转)C# XMPP客户端与openfire通信(Matrix Xmpp 授权破解教程)

    FROM:http://www.cnblogs.com/crabo/p/CRACK_MATRIX_XMPP.html 如此著名的XMPP , 居然试过jabber-net, agsXmpp,matri ...

  6. Mysql的用户名密码设置方法

    方法如下: 1, 关闭mysql服务 /etc/init.d/mysqld stop 2,使用 –skip-grant-tables选项启动mysql服务,可以修 改/etc/inin.d/mysql ...

  7. Windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes

    Windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes http://blog.csdn.n ...

  8. TCP/IP, WebSocket 和 MQTT

    按照OSI网络分层模型,IP是网络层协议,TCP是传输层协议,而HTTP和MQTT是应用层的协议.在这三者之间, TCP是HTTP和MQTT底层的协议.大家对HTTP很熟悉,这里简要介绍下MQTT.M ...

  9. Servant:基于Web的IIS管理工具

    Servant for IIS是个管理IIS的简单.自动化的Web管理工具.安装Servant的过程很简单,只要双击批处理文件Install Servant Service.bat,然后按照屏幕上的说 ...

  10. 【转载】十步完全理解SQL

    很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语言.甚至是函数语言(尽管有些人认为 SQL 语言也是一种函数式语言) ...