zoukankan      html  css  js  c++  java
  • 动态拼接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调试。不成功,遍成人。。

    不用谢我,我叫红领巾。。

  • 相关阅读:
    前端笔记(关于解决打包时报node-sass错误的问题)
    前端笔记(Echarts学习总结)
    前端笔记(近期整理的一些开发备注)
    代码(css3向下箭头指引)
    Hexo 博客利用 Nginx 实现中英文切换
    prefetch 和 preload 及 webpack 的相关处理
    利用 Github 网络钩子实现自动化部署
    使用 Nginx 实现 301 跳转至 https 的根域名
    作为 attribute 和 property 的 value 及 Vue.js 的相关处理
    使用 Vue.js 改写 React 的官方教程井字棋
  • 原文地址:https://www.cnblogs.com/fycayy/p/4138364.html
Copyright © 2011-2022 走看看