---------------------------------------------快速适用

效果:

where name like '%王%' and Age>=35 or Age<10

构建表达式树:(快速式)

1.添加命名空间:

using System.Linq.Expressions;

2.声明参数表达式(比如Book实体)

ParameterExpression param = Expression.Parameter(typeof(Book));

3.

Expression exp = Expression.Constant(true);初始化表达式树;

4.通过反射机制调用string.Contains,构建like;

var methodinfo = typeof(string).GetMethod("Contains");

5.拼接

//Expression.And:表示 and 后面的条件当然还有Or、 >=、<=、=等

//exp:and前面的语句,拼接之前的语句;

//Expression.Call():方法调用表达式;

//Expression.Property(param, "Name")字段或属性表达式

//methodinfo:调用上面Contains方法;

//Expression.Constant(s1):常量表达式;s1=“王”;

exp = Expression.And(exp, Expression.Call(Expression.Property(param, "Name"),methodinfo, Expression.Constant(s1)));

exp = Expression.And(exp, Expression.GreaterThanOrEqual(Expression.Property(param, "Id"),Expression.Constant(35)));

exp = Expression.Or(exp, Expression.LessThan(Expression.Property(param, "Id"), Expression.Constant(10)));

6.描述lambda表达式

var lam = Expression.Lambda<Func<Book, bool>>(exp, param);

7.调用

var lis = books.Where<Book>(lam).ToList();

------------------------------------------------------------详细(转述网友秦迷)

//---------------动态创建表达式目录树---------------//

//名字模糊查询tony

//年龄大于等于20

//年龄小于30

string uname = "tony";

List<Expression> expList = new List<Expression>(2);

ParameterExpression parExp = Expression.Parameter(typeof(UserInfo), "infos");//创建需要查找的参数

//查姓名infos.UserName.Contains("tony")

MemberExpression unameExp = Expression.Property(parExp, "UserName");

MethodInfo containsMethod = typeof(string).GetMethod("Contains");//using System.Reflection;指定实现Contains方法

ConstantExpression unamevalueExp = Expression.Constant(uname, typeof(string));

MethodCallExpression containsExp = Expression.Call(unameExp, containsMethod, unamevalueExp);

expList.Add(containsExp);

//查年龄infos.Age>=20

MemberExpression age1 = Expression.Property(parExp, "Age");

ConstantExpression agevalue1 = Expression.Constant(20, typeof(int));

BinaryExpression gteExp = Expression.GreaterThanOrEqual(age1, agevalue1);

expList.Add(gteExp);

//查年龄infos.Age<30

//if (1 > 2)

//{

MemberExpression age2 = Expression.Property(parExp, "Age");

ConstantExpression agevalue2 = Expression.Constant(30, typeof(int));

BinaryExpression ltExp = Expression.LessThan(age2, agevalue2);

expList.Add(ltExp);

//}

//把上面的表达式连接起来

Expression whereExp = null;

foreach (var item in expList)

{

if (whereExp == null)

{

whereExp = item;

}

else

{

whereExp = Expression.And(whereExp, item);

/*

* 出错信息:

* 没有为类型“System.Boolean”和“System.Boolean”定义二进制运算符 Add。

* 是And,开始我写错成了Add一直找不到原因

*/

}

}

//生成Lambda表达式

//Expression<Func<UserInfo, bool>> lambda = Expression.Lambda<Func<UserInfo, bool>>(whereExp, parExp);

LambdaExpression lambda = Expression.Lambda<Func<UserInfo, bool>>(whereExp, parExp);

Console.WriteLine(lambda);

/*

* 生成结果:

* infos => ((infos.UserName.Contains("tony") And (infos.Age>=20)) And (infos.Age<30))

*/

最新文章

  1. Spring &lt;context:annotation-config/&gt; 解说
  2. Hive Experiment 2(表动态分区和IDE)
  3. [转]在VS2010 VC++项目中引用Lib静态库(以Openssl为例)
  4. MBProgressHUD.h file not found
  5. mysql数据库开发规范
  6. Go原子计数
  7. 学习Linux第三天
  8. (转载)一句简单命令重启nginx - [nginx]
  9. JNI 技术与 Android 应用
  10. 执行游戏时出现0xc000007b错误的解决方法
  11. QT中共享库的生成与使用
  12. Gstreamer的一些基本概念与A/V同步分析
  13. Android判断网络连接状态
  14. 【转】进程间通信方式总结(windows 和linux)
  15. vue配置jquery和bootstarp
  16. SpringBank 开发日志 使用maven构建dubbo服务的可执行jar包
  17. Oracle DBA神器之Toad
  18. WEBBASE篇: 第二篇, HTML知识2
  19. 微赞微擎V0.8以上版本:【数据库读写分离】实战教程 [复制链接]
  20. oc set/get方法

热门文章

  1. Android的相关的源代码的方法
  2. 仿jQuery之链式调用
  3. 简单的工具LogUtil、Toast
  4. Codeforces Round #272 (Div. 1)D(字符串DP)
  5. 馋-c语言的规则
  6. 利用css新属性appearance优化select下拉框
  7. crawler_浅谈网络爬虫
  8. krpano音量控制(我们已经转移到krpano中国网站 krpano360.com)
  9. Linux通过编辑器vi使用介绍
  10. Errors occurred during the build. Errors running builder &amp;#39;JavaScript Validator&amp;#39; on