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

效果:

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))

*/

EF4.0、4.3创建表达式树状动态查询总结的更多相关文章

  1. 表达式:使用API创建表达式树(2)

    一.BlockExpression类:表式一个包含可在其中定义变量的表达式序列的块.是一组表达式,类似于多个委托的 += 后的效果,其返回表达式是最后一个表达式决定.以下是BlockExpressio ...

  2. 【C#表达式树 五】工厂模式创建表达式树节点

    常量 1.值常量  (p)=>100+88+p ParameterExpression par = Expression.Parameter(typeof(int), "p" ...

  3. 表达式:使用API创建表达式树(3)

    一.DebugInfoExpression:发出或清除调试信息的序列点. 这允许调试器在调试时突出显示正确的源代码. static void Main(string[] args) { var asm ...

  4. C#3.0新增功能10 表达式树 01 简介

    连载目录    [已更新最新开发文章,点击查看详细] 如果你使用过 LINQ,则会有丰富库(其中 Func 类型是 API 集的一部分)的经验. (如果尚不熟悉 LINQ,建议阅读 LINQ 教程,以 ...

  5. C#3.0新增功能10 表达式树 03 支持表达式树的框架类型

    连载目录    [已更新最新开发文章,点击查看详细] 存在可与表达式树配合使用的 .NET Core framework 中的类的大型列表. 可以在 System.Linq.Expressions 查 ...

  6. C#3.0新增功能10 表达式树 06 生成表达式

    连载目录    [已更新最新开发文章,点击查看详细] 到目前为止,你所看到的所有表达式树都是由 C# 编译器创建的. 你所要做的是创建一个 lambda 表达式,将其分配给一个类型为 Expressi ...

  7. 动态构建Lambda表达式实现EF动态查询

    在使用Entity Framework做数据查询的时候,查询条件往往不是固定的,需要动态查询.可以通过动态构建Lamda表达式来实现动态查询. Lamda表达式 使用Lamda表达式可以很方便的按条件 ...

  8. 表达式:使用API创建表达式树(1)

    表达式树可使用Expressions类的静态工厂方法来创建.这种用API的方式创建给予我们在编程极大的灵活性,MSDN上关于表达式的例子也不少,但在使用过程中还是会遇到许多麻烦,对有的表达式类,介绍得 ...

  9. C#3.0新增功能10 表达式树 02 说明

    连载目录    [已更新最新开发文章,点击查看详细] 表达式树是定义代码的数据结构. 它们基于编译器用于分析代码和生成已编译输出的相同结构.表达式树和 Roslyn API 中用于生成分析器和 Cod ...

随机推荐

  1. Java在的时候,类定义HashSet初始化方法

    Java非常多的时间,应使用HashSet搜索功能,类的则定义,是HashSet类型的,我们定义数据成员之后,不好直接调用add函数来实现初始化,这个时候怎么办? 我们能够这样来做: public s ...

  2. VisualSVN

    Symptoms When performing a large commit to VisualSVN Server over the HTTPS protocol, the Subversion ...

  3. 【电视桌面CSWUI】电视桌面(launcher)截图欣赏

    网络播放器是最重要的电视桌面.cswui,我们公司做了一个非常大的人力,物力搞一个电视柜.后来一一介绍,简言之发送屏幕截图.给大家看. watermark/2/text/aHR0cDovL2Jsb2c ...

  4. PHP Yii框架开发——组织架构网站重构

    最近一段时间在维护公司的组织架构网站(Org),旧版网站只是用了xampp简单搭建了一套环境部署在了windows机器上,代码结构相对简单. 整个架构如下: 整个架构没有用到复杂的结构,class里放 ...

  5. C++ Primer 学习笔记_29_STL实践与分析(3) --操作步骤集装箱(下一个)

    STL实践与分析 --顺序容器的操作(下) 六.訪问元素 假设容器非空,那么容器类型的front和back成员将返回容器的第一个和最后一个元素的引用. [与begin和end的对照:] 1)begin ...

  6. 【Android】九宫格实现

    第一步,布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

  7. [Python 2.7] Hello World CGI HTTP Server

    # CGI HTTP server ## Getting Started Python 2.x is preferred to this simple demo. I'm using Python 2 ...

  8. shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、功能、select

    1.expr计算整数变量值 s=`expr 2 + 3` 运算符号和參数之间要有空格分开: 2.let命令 let s=(2+3)*4 echo $s 3.for语句 for 变量 in 列表 do ...

  9. oracle_连接数_查看

    查看oracle数据库的连接数以及用户   .查询oracle的连接数 select count(*) from v$session; .查询oracle的并发连接数 select count(*) ...

  10. thymeleaf模板引擎shiro集成框架

    shiro权限框架.前端验证jsp设计.间tag它只能用于jsp系列模板引擎. 使用最近项目thymeleaf作为前端模板引擎,采用HTML档,未出台shiro的tag lib,假设你想利用这段时间s ...