动态拼接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出来之后, 就基本上爱不释手了, 且不说执行效率的问题, 单单就开发效率和代码的可移植性 ...
随机推荐
- Java SE 基础:标识(zhì)符
Java SE 基础:标识(zhì)符 一.标识符定义 标识符,就是给类.接口.方法.变量等起名字时的字符序列 二.组成规则与注意事项 1.组成规则 英文大小写字母 数组 $ 和 _ 2.注意事项 不 ...
- Other linker flags
-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使 ...
- Java进行post和get传参数
http://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html get和post方法 import java.io.BufferedRe ...
- 2.用vs2015创建Dotnet Core的mvc项目
如果你正确安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2,将会看到 就是第二个选项 ASP.NET Core Web Application 选择第三个,第一次 ...
- Spark学习(三) -- SparkContext初始化
标签(空格分隔): Spark 本篇博客以WordCount为例说明Spark Job的提交和运行,包括Spark Application初始化.DAG依赖性分析.任务的调度和派发.中间计算结果的存储 ...
- ChartControl 折线图 柱状图
添加折线图(柱状图) 拖动ChartControl到Form上 在Series Collection中添加Line(或Bar) DevExpress.XtraCharts.Series series1 ...
- word 文档 一次性设置多张图片大小
1.打开WORD文档,插入多张图片. 2.在word中按alt+f11组合键,进入VBA模式. 3.在左边的工程资源管理器中找到你的word文档,在其上右键/添加/模块 4.复制以下代码 Sub Ma ...
- 代码性能优化——task
var t1 = Task.Factory.StartNew(delegate { //代码(查接口.数据库) }); 缺点: 不能使用request( HttpContext.Current.Req ...
- 实现table的单线边框的办法
实现table的单线边框的办法 现在给出效果图: 1.实现方法一: <table border="0" cellspacing="1" style= ...
- 输入事件驱动---evdev_handler的大致实现流程(修整版)
一.input输入子系统框架 下 图是input输入子系统框架,输入子系统由输入子系统核心层(input core),驱动层和事件处理层(Event Handler)三部分组成.一个输入事件,比如滑动 ...