动态拼接linq 使用Expression构造动态linq语句
最近在做动态构造linq语句,从网上找了很多,大多数,都是基于一张表中的某一个字段,这样的结果,从网上可以搜到很多。但如果有外键表,需要动态构造外键表中的字段,那么问题来了,学挖掘机哪家强?哦,不是,应该怎么做呢。
关于动态构造linq的,http://www.cnblogs.com/blusehuang/archive/2007/07/13/816970.html 该文章已经描述的很清楚了。我也不多说了。
其中,关键的代码是:
Expression con = Expression.Call(
Expression.Property(c, typeof(T).GetProperty(key)),
typeof(string).GetMethod("Contains", new Type[] { typeof(string) }),
Expression.Constant(parameters[key])
);
当我们有一张表,如下:
public class Test{
public int A{get;set;}
public string B{get;set;}
public Test2 T2 {get;set;}
}
还有Test2表:
public class Test2{
public int Id{get;set;}
public string Name{get;set;}
}
要从Test表中查询到Test2表中的linq语句,是这样写的。
DBContext.Entities.Where(x=>x.T2.Name.Contains("a"));
那么,问题来了,学挖掘机哪家强呢?额,不对,转成动态的如何转呢???
单个动态构造还是清晰易懂的,
Expression.Property(c, typeof(T).GetProperty(key))
这句代码表示,读取Test类型下的某个字段,这里应该是是Test2,那我们改成:
Expression.Property(c, typeof(Test1).GetProperty(Test2))
恩,对了,思路正确,下一部就比较关键了,我要继续查找T2下的Name属性该如何操作呢??再我调试了之后,发现了一个秘密。。
最终的代码:
var member = Expression.Property(c, typeof(Test).GetProperty("T2"));
var member2 = Expression.Property(member, typeof(Test2).GetProperty("Name"));
Expression con = Expression.Call(
member2,
typeof(string).GetMethod("Contains", new Type[] { typeof(string) }),
Expression.Constant("a")
);
这样,其linq表达式生成的代码就是c=>c.T2.Name.Contains("a") 了。 是不是so easy,解决了两张表的关联,其他的问题就好说了,如果还不知道的话,请将自己敲个示例,F5调试。不成功,遍成人。。
不用谢我,我叫红领巾。。
动态拼接linq 使用Expression构造动态linq语句的更多相关文章
- 用RestTemplate调取接口,取得返回数据,携带header,动态拼接url ,动态参数
记录我自己的工作 get 请求 ,携带 请求头 header (token) url 根据参数 动态拼接 参数 放入 map 动态拼接 private String lclUrl = &quo ...
- Linq to Sql : 动态构造Expression进行动态查询
原文:Linq to Sql : 动态构造Expression进行动态查询 前一篇在介绍动态查询时,提到一个问题:如何根据用户的输入条件,动态构造这个过滤条件表达式呢?Expression<Fu ...
- .NetCore 使用 Linq 动态拼接Expression表达式条件来实现 对EF、EF Core 扩展查询排序操作
相信在使用EF的时候对查询条件或者排序上的处理令人心烦,下面我们就来动态拼接表达式解决这一问题 当我们在查询中使用Where的时候可以看到如下参数 下面我们就来扩展 Expression<Fun ...
- linq里lambda写的join查询,并附加动态拼接的条件,条件为enum类型的查询
因为查询条件不固定的原因,sql式的linq查询没法动态拼接条件. 网上搜的资料整理之后终于解决. 参考资料: enum使用 http://blog.csdn.net/slowlifes/articl ...
- 分享动态拼接Expression表达式组件及原理
前言 LINQ大家都知道,用起来也还不错,但有一个问题,当你用Linq进行搜索的时候,你是这样写的 var query = from user in db.Set<User>() ...
- Linq技术四:动态Linq技术 -- Linq.Expressions
前面介绍了Linq的三个方面应用:Linq to SQL, Linq to XML和Linq to Object,这篇介绍一下动态Linq的实现方式及应用场景. 命名空间: System.Linq; ...
- Expression表达式目录树动态拼接 反射获取泛型方法
class TestOne { public String[] arr = { "1", "2", "3" }; public class ...
- 动态拼接表达式——Expression
我们在项目中会遇到以下查询需求吗? 比如需要查询出满足以下条件的会员: 条件组一:30-40岁的男性会员 条件组二:20-30岁的女性会员 条件组三:60-80岁性别未知的会员 条件组内是并且关系,但 ...
- 如何使用 Entity Framework 构造动态查询表达式
一般的程序员做上几年以后, 或多或少的都有些代码的积累, 我也不例外. 作为微软技术程序员, 自从Linq和EF出来之后, 就基本上爱不释手了, 且不说执行效率的问题, 单单就开发效率和代码的可移植性 ...
随机推荐
- jvisualvm参数配置
1.java 命令启动 nohup java -Dlocalcfg=true -Dcom.sun.management.jmxremote.port=9998 -Dcom.sun.management ...
- Client Window坐标 RECT相关函数
GetClientRect(HWND, RECT*) ---得到窗口的客户区大小,left,top总是0,bottom是客户区高度,right是客户区宽度 GetWindowRect(HWND, RE ...
- Radmin Center 1.54 测试版
软件简介:radmin center 用于集中管理安装了 radmin server 的服务器,支持一键远程管理,数据全部本地存储,关键数据使用RC4变形加密.同时保留了radmin的高安全性和高易用 ...
- 【前端】iterable类型的 forEach方法
看三个例子: a = [ age: 1 , age: 2 ] a.forEach (item) -> item.age = 0 # 有效 console.log a # [ # age: 0 # ...
- Jboss配置之数据源密码配置密文--EncryptingDataSourcePasswords
local-tx-datasource:最常用的数据源配置,该连接池的连接管理器是LocalTxConnectionManager,只支持本地事务,不适合做分布式事务.以mssql为例如下:如果密码按 ...
- MySQL 添加列, 修改列, 删除列
ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 查看数据库创建语句: show create database 数据库名: 查看创建表的语句: show c ...
- Spring MVC简介
Spring MVC简介 Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...
- (原创)Xilinx的ISE生成模块ngc网表文件
ISE中,右击“Synthesize”,选中“Process Properties”,将“Xilinx Specific Options:-iobuf”的对勾取消. 将取消模块的ioBuff,因为模块 ...
- Java集合框架
集合框架体系如图所示 Java 集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包. Map接口的常用方法 Map接口提 ...
- C# 文件类型
C# 中一些常用文件类型: designer.cs 是窗体设计器生成的代码文件,作用是对窗体上的控件做初始化工作(在函数InitializeComponent()中).VS2003以前都把这部分代码放 ...