EF4.0、4.3创建表达式树状动态查询总结
---------------------------------------------快速适用
效果:
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创建表达式树状动态查询总结的更多相关文章
- 表达式:使用API创建表达式树(2)
一.BlockExpression类:表式一个包含可在其中定义变量的表达式序列的块.是一组表达式,类似于多个委托的 += 后的效果,其返回表达式是最后一个表达式决定.以下是BlockExpressio ...
- 【C#表达式树 五】工厂模式创建表达式树节点
常量 1.值常量 (p)=>100+88+p ParameterExpression par = Expression.Parameter(typeof(int), "p" ...
- 表达式:使用API创建表达式树(3)
一.DebugInfoExpression:发出或清除调试信息的序列点. 这允许调试器在调试时突出显示正确的源代码. static void Main(string[] args) { var asm ...
- C#3.0新增功能10 表达式树 01 简介
连载目录 [已更新最新开发文章,点击查看详细] 如果你使用过 LINQ,则会有丰富库(其中 Func 类型是 API 集的一部分)的经验. (如果尚不熟悉 LINQ,建议阅读 LINQ 教程,以 ...
- C#3.0新增功能10 表达式树 03 支持表达式树的框架类型
连载目录 [已更新最新开发文章,点击查看详细] 存在可与表达式树配合使用的 .NET Core framework 中的类的大型列表. 可以在 System.Linq.Expressions 查 ...
- C#3.0新增功能10 表达式树 06 生成表达式
连载目录 [已更新最新开发文章,点击查看详细] 到目前为止,你所看到的所有表达式树都是由 C# 编译器创建的. 你所要做的是创建一个 lambda 表达式,将其分配给一个类型为 Expressi ...
- 动态构建Lambda表达式实现EF动态查询
在使用Entity Framework做数据查询的时候,查询条件往往不是固定的,需要动态查询.可以通过动态构建Lamda表达式来实现动态查询. Lamda表达式 使用Lamda表达式可以很方便的按条件 ...
- 表达式:使用API创建表达式树(1)
表达式树可使用Expressions类的静态工厂方法来创建.这种用API的方式创建给予我们在编程极大的灵活性,MSDN上关于表达式的例子也不少,但在使用过程中还是会遇到许多麻烦,对有的表达式类,介绍得 ...
- C#3.0新增功能10 表达式树 02 说明
连载目录 [已更新最新开发文章,点击查看详细] 表达式树是定义代码的数据结构. 它们基于编译器用于分析代码和生成已编译输出的相同结构.表达式树和 Roslyn API 中用于生成分析器和 Cod ...
随机推荐
- Navicat工具Oracle数据库复制 or 备用、恢复功能(评论都在谈论需要教)
GXPT它是一个分布式系统,该系统包括一个临时许可系统.基本系统.教学评价体系.考试系统,每个系统都有自己的oracle数据库.统,而评教系统的正常须要借助于权限系统和基础系统,详细的业务这里就不多解 ...
- Leetcode dfs Combination SumII
Combination Sum II Total Accepted: 13710 Total Submissions: 55908My Submissions Given a collection o ...
- thymeleaf模板引擎shiro集成框架
shiro权限框架.前端验证jsp设计.间tag它只能用于jsp系列模板引擎. 使用最近项目thymeleaf作为前端模板引擎,采用HTML档,未出台shiro的tag lib,假设你想利用这段时间s ...
- cmd介面,进adb命令提示符error
有几个操作的电话系统测试,需要输入adb命令时出现了头疼的事,当输入命令,一个直接报执行:error 推荐处理的方法: 1.当然就是关机重新启动.之前我是这样,挺麻烦.必进在win7上输入命令费时间. ...
- 在遍历中使用 iterator/reverse_iterator 进行 Erase 的使用方法
在遍历中使用 iterator/reverse_iterator 进行 Erase 的使用方法 罗朝辉 (http://blog.csdn.net/kesalin/) 本文遵循"署名-非商业 ...
- 怎样才能充分利用SQL索引
原文:怎样才能充分利用SQL索引 背景:目前WEB的普及太快,很多网站都会因为大流量的数据而发生服务器习惯性死机,一个查询语句只能适用于一定的网络环境.没有优化的查询当遇上大数据量时就不适用了. 本文 ...
- JDBC连接池的简单实现
首先解释一下,我在做自己android发育.java web这是我的弱点,就在最近,京东云免费,因此,要折腾几.有一点经验,特别是作为共享. 假设内容的文章是错,还请高手指正. 我在这里web结束,需 ...
- SEO 优化,网站推广优化教程100条(SEO,网站关键字优化,怎么优化网站,如何优化网站关键字)
这篇文章不错. http://www.cnblogs.com/zangdalei/archive/2010/08/31/1814047.html 看了一半之后的,觉得不太靠谱,很多都不懂. 于是 找 ...
- PL/SQL联系oracle成功可以sql解决的办法是检查表的名称无法显示
有时,因为机器突然断电或其他原因PL/SQL它甚至不能在数据库表后显示.序列和其它元素.使用SQL Windows运行查询一般查询,登录或同样的现象再次. 我是不是可以解决因重复登录的猜测是,PLSQ ...
- 如何将经纬度利用Google Map API显示C# VS2005 Sample Code
原文 如何将经纬度利用Google Map API显示C# VS2005 Sample Code 日前写了一篇如何用GPS抓取目前所在,并回传至资料库储存,这篇将会利用这些回报的资料,将它显示在地图上 ...