同一个服务器下的不同数据库,目前还没有进行跨服务器的查询,以后有待研究……

1.使用的是Left Join左查询,因此连接字符串应该是写的第一个表所在的数据库的连接字符串

假设数据库A,B,连接字符串分别为

A
server=localhost;Port=8090;user id=sa;password=123456;persistsecurityinfo=True;database=A;Charset=utf8;SslMode=none;Pooling=true;allowPublicKeyRetrieval=true
B
server=localhost;Port=8090;user id=sa;password=123456;persistsecurityinfo=True;database=B;Charset=utf8;SslMode=none;Pooling=true;allowPublicKeyRetrieval=true

一开始我陷入一个误区,我以为连接字符串的database参数只能写一个数据库,那就只能访问这一个数据库。那怎么去访问另一个呢?

2.1   左连接第一个查询的表tr_devicepoleinproject是数据库B里的表,则使用的DB应是  采用数据库B的连接字符串

  若是我第一个查询的是数据库B内的表,则连接字符串应以数据库B的为主。  若是不以此种方式去建立连接则无法查询

2.2  每一个查询表的后面要跟上这个表所在的数据库和表名   

   即     .AS<表A>("数据库A.表A")      AS<表B>("数据库A.表B")     

      .AS<表A1>("数据库B.表A1")    .AS<表B1>("数据库B.表B1") 

注意第一个查询的表不需要带<>  直接写  AS("“数据库名.表名”)  即可

剩下的就是正常的Left  join  查询   具体参考代码 如下:↓↓↓↓↓↓

            var counts = DB_B.Queryable<tr_devicepoleinproject>().AS("B.tr_devicepoleinproject")
                        .LeftJoin<tr_devicepoleindevice>((a, b) => a.DevicePoleID == b.DevicePoleID).AS<tr_devicepoleindevice>("B.tr_devicepoleindevice")
                        .LeftJoin<tr_deviceinoperationcompany>((a, b, c) => b.DeviceID == c.DeviceID).AS<tr_projectdevelopercompanyinoperationcompany>("B.tr_projectdevelopercompanyinoperationcompany")
                        .LeftJoin<tb_device>((a, b, c, d) => d.DeviceID == b.DeviceID).AS<tb_device>("B.tb_device")
                        .LeftJoin<tb_project>((a, b, c, d, e) => a.ProjectID == e.ProjectID).AS<tb_project>("B.tb_project")
                        .LeftJoin<tb_devicepole>((a, b, c, d, e, f) => a.DevicePoleID == f.DevicePoleID).AS<tb_devicepole>("B.tb_devicepole")
                        .LeftJoin<tb_operationcompany>((a, b, c, d, e, f, g) => c.OperationCompanyID == g.ID).AS<tb_operationcompany>("B.tb_operationcompany")
                        .LeftJoin<tb_monitordataday>((a, b, c, d, e, f, g, h) => a.DevicePoleID == h.PoleID && (h.UploadTime >= Convert.ToDateTime($"{start}") && h.UploadTime <= Convert.ToDateTime($"{end}"))).AS<tb_monitordataday>("A.tb_monitordataday")
                    .Where((a,b,c,d,e)=>e.ProjectDistrictID==3)
                    .GroupBy((a, b)=> new { b.DeviceID })
                    .Select((a, b, c, d, e, f, g, h) => new ExportData
                    {
                        MNCode = !string.IsNullOrWhiteSpace(h.DeviceMNCode) ? h.DeviceMNCode : d.MNCode,
                        //Tsp = h.MetricA34001 > 0 ? h.MetricA34001.ToString() : null,  SqlFunc.AggregateAvg(it.Id)
                        Tsp = (double)SqlFunc.AggregateAvg(h.MetricA34001),
                        ProjectName = e.ProjectName,
                        ProjectAddress = e.ProjectAddress,
                        OperationCompanyName = g.CompanyName,
                        CreateTime = e.CreateTime.ToString(),
                        Status = f.Status == 0 ? "新增未上线" : f.Status == 1 ? "正常" : f.Status == 2 ? "维护" : f.Status == 3 ? "更换" : f.Status == 4 ? "暂停" : "拆除"
                    }).ToList();

总结:也是第一次做跨库的查询,难免陷入旧思想的误区,以为需要填入不同的连接字符串才能建立连接,甚至想到分开查询两个数据库的值,然后再进行查询,不过最后还是花费较少的代码去解决问题了,就是花在梳理业务逻辑上面挺多时间的,有待继续努力!!!

 

posted on 2022-09-09 09:14  尝尝手指  阅读(1238)  评论(0编辑  收藏  举报