专栏首页程序员的SOD蜜使用OQL+SQLMAP解决ORM多表复杂的查询问题

使用OQL+SQLMAP解决ORM多表复杂的查询问题

    一般情况下,使用ORM框架来完成单个实体的查询是很方便的,但如果有复杂的查询条件,普通的ORM组件比较困难,PDF.NET数据开发框架的ORM实体类查询语言--OQL,使得构造复杂的查询条件成为可能,参加我的其它相关文章

    很多ORM框架都只能处理单个实体的查询,但如果要连表查询就比较困难了,主要问题是连表查询的结果无法投射到一个实体类中,这时候只有动态创建一个类来处理,比如LINQ的Select功能。在PDF.NET数据开发框架中,多表连接查询推荐使用SQL-MAP功能(参加我的相关文章),将复杂的SQL语句写到SQL-MAP配置文件中,然后使用代码生成器生成SqlMapDal类文件,供业务层使用。

    今天有一个同事需要在实体类的条件中增加一个复杂的In查询,由于In的条件有4万条,采用SQL的In查询效率极其低下,但是采用Inner Join查询能够提升5倍的查询效率,而框架的ORM又不支持多表连接查询,单独使用SQL-MAP功能,要大量修改原有代码,原有代码是一个长达4000行的方法,那个方法最有大量的循环和分支,用于构造实体类的查询条件对象(OQLCompare对象),最终构造了一个复杂的OQL查询条件:

OQL oql=GetOQLbyBussiness();//这个方法有4000行代码;
string sql=oql.ToString();//大致是 select * from table1 where condition1
sql=GetInnerJoinSql(sql,"另外一个表的查询语句");
//执行这个方法将得到大致的查询语句 
//select * from table1 t1 inner join table2 t2 where t1.CID=t2.Cid and condition1

    本来使用 EntityQuery<EntityModelClass>.Query(oql) 即可获得 List<EntityModelClass>,但现在为了添加另外一个表的查询,将oql转换成了sql语句,怎么能够再次生成实体类呢?

    现在,我们可以使用SQL-MAP来帮助了。

    打开原来的SqlMapDal文件,为了不让代码生成器覆盖自动生成的文件,我们新建一个分部文件,手写如下代码:

using System;
using System.Data;
using System.Collections.Generic;
using PWMIS.DataMap.SqlMap;
using PWMIS.DataMap.Entity;
using PWMIS.Common;
using XXModel;
namespace XXDAL.SqlMapDAL
{
    public partial class CustomerManage
        : DBMapper
    {
        public List<CustomerClassification> GetCustomerList(string sql, Dictionary<string, object> ps)
        {
            IDataParameter[] paras = new IDataParameter[ps.Count];
            int i = 0;
            foreach (string key in ps.Keys)
                   paras[i++] = CurrentDataBase.GetParameter(key, ps[key]);
            
            return EntityQuery<CustomerClassification>.QueryList(CurrentDataBase.ExecuteReader(CurrentDataBase.ConnectionString, System.Data.CommandType.Text, sql, paras));
                   }
    }
}

然后,在业务层中,如下调用即可:

XXDAL.SqlMapDAL.CustomerManage manage=new XXDAL.SqlMapDAL.CustomerManage();
List<CustomerClassification> customerClass=manage.GetCustomerList(sql,oql.DataParameters);

这样就获得了我们的最终结果。

请注意,我们把oql的参数对象DataParameters 传递给了DAL方法,用于构造参数化查询。

总结:

结合使用PDF.NET框架的OQL+SQLMAP,可以在不放弃实体类的便利情况下,进行复杂的多表查询!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 条件表达式的短路求值与函数的延迟求值

    延迟求值是 .NET的一个很重要的特性,在LISP语言,这个特性是依靠宏来完成的,在C,C++,可以通过函数指针来完成,而在.NET,它是靠委托来完成的。如果不...

    用户1177503
  • “领域驱动开发”实例之旅(1)--不一样的开发模式      一、分析业务需求。    二、设计领域对象模型    三、测试领域对象模型    四、设计业务处理类    五、设计Entity和Vi

        听说DDD-“领域驱动开发”已经很久了,园子里面已经有不少大牛写过博文介绍,但我一直没有尝试过,直到今年公司的一个项目出现数据库移植,原来的业务逻辑都写...

    用户1177503
  • DDD为何叫好不叫座?兼论DCI与业务分析的方法论

         今天,仔细阅读了园子里面的一个朋友写的《一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?》(http...

    用户1177503
  • 一次神奇的 SQL 查询经历

    现网出现慢查询,在500万数量级的情况下,单表查询速度在30多秒,需要对sql进行优化,sql如下:

    用户1516716
  • 探究导致 MySQL 慢查询的因素:从硬件、网络到数据库的深度剖析

    不管是开发同学还是DBA,想必大家都遇到慢查询(select,update,insert,delete 语句慢),影响业务稳定性。这里说的慢,有两个含义一是比正...

    用户2781897
  • 哪些因素会导致慢查询?

    不管是开发同学还是DBA,想必大家都遇到慢查询(select,update,insert,delete 语句慢),影响业务稳定性。这里说的慢,有两个含义一是比正...

    用户1278550
  • 记一次神奇的SQL查询经历,group by慢查询优化

    简单来说,就是查询一定条件下,都有哪些用户的。很简单的sql,可以看到,查询耗时为37秒。

    数据和云
  • 解Bug之路-中间件"SQL重复执行"

    我们的分库分表中间件在线上运行了两年多,到目前为止还算稳定。在笔者将精力放在处理各种灾难性事件(例如中间件物理机宕机/数据库宕机/网络隔离等突发事件)时。竟然发...

    无毁的湖光-Al
  • 记一次详细的的SQL查询经历,group by慢查询优化

    现网出现慢查询,在500万数量级的情况下,单表查询速度在30多秒,需要对sql进行优化,sql如下:

    数据和云
  • Flink流之动态表详解

    问题导读 1.动态表有什么特点? 2.流处理与批处理转换为表后有什么相同之处? 3.动态表和连续查询是什么关系? 4.连续查询本文列举了什么例子? 5.Flin...

    用户1410343

扫码关注云+社区

领取腾讯云代金券