【C#】DbToLinq多表连接

系列文章

【C#】最全业务单据号生成(支持定义规则、流水号、传参数)

本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787

【C#】日期范围生成器(开始日期、结束日期)

本文链接:https://blog.csdn.net/youcheng_ge/article/details/129040663

【C#】组件化开发,调用dll组件方法

本文链接:https://blog.csdn.net/youcheng_ge/article/details/129492112

【C#】数据实体类使用

本文链接:https://blog.csdn.net/youcheng_ge/article/details/128816638

【C#】单据审批流方案

本文链接:https://blog.csdn.net/youcheng_ge/article/details/128972545

【C#】条码管理操作手册

本文链接:https://blog.csdn.net/youcheng_ge/article/details/126589496

【C#】IIS平台下,WebAPI发布及异常处理

本文链接:https://blog.csdn.net/youcheng_ge/article/details/126539836

【C#】代码模板生成工具

本文链接:https://blog.csdn.net/youcheng_ge/article/details/126890673

【C#】MySQL数据库导入工具(批量Excel插入)

本文链接:https://blog.csdn.net/youcheng_ge/article/details/126427323

【C#】简单二维码制作和打印工具

本文链接:https://blog.csdn.net/youcheng_ge/article/details/126884228

【C#】最全单据打印(打印模板、条形码&二维码、字体样式、项目源码)

本文链接:https://blog.csdn.net/youcheng_ge/article/details/129415723

【C#】Windows服务(Service)安装及启停方案

本文链接:https://blog.csdn.net/youcheng_ge/article/details/124053794

【C#】穿透Session隔离,服务调用外部程序(无窗体界面解决)

本文链接:https://blog.csdn.net/youcheng_ge/article/details/124053033

【C#】任务计划实现,使用Quartz类

本文链接:https://blog.csdn.net/youcheng_ge/article/details/123667723

【C#】源码解析正则表达式

本文链接:https://blog.csdn.net/youcheng_ge/article/details/118337074

【C#】软件版本和文件MD5记录(XML操作)

本文链接:https://blog.csdn.net/youcheng_ge/article/details/112513871

【C#】测试网络是否连通

本文链接:https://blog.csdn.net/youcheng_ge/article/details/110137288

【C#】根据名称获取编码(Dictionary获取key方法)

本文链接:https://blog.csdn.net/youcheng_ge/article/details/129816701

【C#】数据建模,你是使用DataTable还是List?

本文链接:https://blog.csdn.net/youcheng_ge/article/details/129792726

【C#】GridControl控件和数据集双向绑定

本文链接:https://blog.csdn.net/youcheng_ge/article/details/129423755

【C#】GridControl动态更换DataSource,数据查询异常处理

本文链接:https://blog.csdn.net/youcheng_ge/article/details/130305424

【C#】GridControl日期字段显示时分秒

本文链接:https://blog.csdn.net/youcheng_ge/article/details/130718303

【C#】GridControl增加选择列(不用二次点击)

本文链接:https://blog.csdn.net/youcheng_ge/article/details/130763713

【C#】数据库检查工具(可跨库访问)

本文链接:https://blog.csdn.net/youcheng_ge/article/details/97172329

【C#】代码解析--打印数据集

本文链接:https://blog.csdn.net/youcheng_ge/article/details/131431829

【C#】代码解析--截取整个方法函数

本文链接:https://blog.csdn.net/youcheng_ge/article/details/109817809

【C#】反射机制,动态加载类文件

本文链接:https://blog.csdn.net/youcheng_ge/article/details/131435110


文章目录

  • 系列文章
  • 前言
  • 一、问题描述
  • 二、解决方案
  • 三、软件开发(源码)
    • [3.1 三表连接+返回指定DTO](#3.1 三表连接+返回指定DTO)
    • [3.2 两表连接+汇总合计+返回表数据](#3.2 两表连接+汇总合计+返回表数据)
    • [3.3 两表连接+返回单表数据](#3.3 两表连接+返回单表数据)
    • [3.4 单表数据重赋值](#3.4 单表数据重赋值)
    • [3.5 多表+先筛选后连接+重赋值](#3.5 多表+先筛选后连接+重赋值)
    • [3.6 两表连接+返回映射数据](#3.6 两表连接+返回映射数据)
    • [3.7 多表左连接+重赋值](#3.7 多表左连接+重赋值)
    • [3.8 两表连接+返回映射DTO](#3.8 两表连接+返回映射DTO)
    • [3.9 两表连接+DB和List](#3.9 两表连接+DB和List)
  • 四、项目展示
  • 五、资源链接

前言

我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,这样外部函数就无法访问你。 又想让你成为全局常量,这样在我的整个生命周期都可以调用你。 可惜世上没有这样的常量,我也无法定义你,因为你在我心中是那么的具体。

哈喽大家好,本专栏为【项目实战】,有别于【底层库】专栏,我们可以发现增加 了『问题描述』、『项目展示』章节,十分贴合项目开发流程,让读者更加清楚本文能够解决的问题、以及产品能够达到的效果。本专栏收纳项目开发过程中的解决方案,是我项目开发相对成熟、可靠方法的总结,在不涉及职务作品保密协议 的前提下,我将问题的解决方案重新梳理,撰写本文分享给大家,大家遇到类似问题,可按本文方案处理。

本专栏会持续更新,不断完善,专栏文章关联性较弱(文章之间依赖性较弱,没有阅读顺序)。大家有任何问题,可以私信我。如果您对本专栏感兴趣,欢迎关注吧,我将带你用最简洁的代码,实现复杂的功能。

·提示:本专栏为项目实战篇,未接触项目开发的同学可能理解困难,不推荐阅读。


一、问题描述

DbToLinq多表连接

二、解决方案

DbToLinq多表连接,采用join,循环等方式

三、软件开发(源码)

3.1 三表连接+返回指定DTO

csharp 复制代码
  var msg = (from t3030 in tpp3030s
                           join t3042 in GetDbContext().GetTable<Tpp3042>()
                           on t3030.Id equals t3042.CCzId into tmp3
                           from t3 in tmp3.DefaultIfEmpty()
                           join t3040 in GetDbContext().GetTable<Tpp3040>()
                           on t3.CTbId equals t3040.Id into tmp4
                           from t4 in tmp4.DefaultIfEmpty()
                           select new
                           {
                               t3030.CMachineId,
                               CPaperGrow = tmp4 == null ? t3030.CPaperGrow : t4.CPaperGrow,
                               t3030.CPlantId,
                               t3030.CPlanDateBeg,
                               t3030.CPlanDateEnd,
                               t3030.CRemark,
                               t3030.CVbapZzpinp,
                               NPaperUnitWgt = tmp4 == null ? t3030.NPaperUnitWgt : t4.NPaperUnitWgt,
                               t3030.NPlanedWgt,
                           })
                    .WhereIf(!papergrows.IsNullOrEmpty(), x => papergrows.Contains(x.CPaperGrow))
                    .WhereIf(unitWgtHigh.HasValue && unitWgtLow.HasValue, x => x.NPaperUnitWgt >= unitWgtLow && x.NPaperUnitWgt <= unitWgtHigh)
                    .WhereIf(unitWgtHigh.HasValue && !unitWgtLow.HasValue, x => x.NPaperUnitWgt == unitWgtHigh)
                    .WhereIf(!unitWgtHigh.HasValue && unitWgtLow.HasValue, x => x.NPaperUnitWgt == unitWgtLow)
                    .Select(x => new DT_Getmespaperplan_RespItem
                    {
                        C_MACHINE_ID = x.CMachineId,
                        C_PAPER_GROW = x.CPaperGrow,
                        C_PLANT_ID = x.CPlantId,
                        C_PLAN_DATE_BEG = x.CPlanDateBeg.ToDateTimeString(),
                        C_PLAN_DATE_END = x.CPlanDateEnd.ToDateTimeString(),
                        C_REMARK = x.CRemark,
                        C_VBAP_ZZPINP = x.CVbapZzpinp,
                        N_PAPER_UNIT_WGT = x.NPaperUnitWgt.ToString(),
                        N_PLANED_WGT = x.NPlanedWgt.ToString()
                    }).ToArray();

3.2 两表连接+汇总合计+返回表数据

csharp 复制代码
  public virtual List<Top3980> GetTop3980Lists(ReportQueryDto dto)
        {
            var db = GetDbContext();


            var useTmp = (from a in db.GetTable<Top3980>()
                          join b in db.GetTable<Top3981>()
                          on a.CConsumeSumNo equals b.CConsumeSumNo
                          select new { a, b.CConsumeSumNo, b.NConsumeWgt, b.CEvalType,b.CUnit })
                          .Where(x => x.a.CConsumeType == ConsumeTypeToOrder)
             .WhereIf(!string.IsNullOrEmpty(dto.CPlant), x => x.a.CPlantId == dto.CPlant)
             .Where(x => x.a.CProductStatus == null)
             .WhereIf(!string.IsNullOrEmpty(dto.CProcCd), x => x.a.CProcCd == dto.CProcCd)
             .WhereIf(!string.IsNullOrEmpty(dto.CClassGroup), x => x.a.CClassGroup == dto.CClassGroup)
             .WhereIf(dto.DClassDate != null && dto.DClassDate != DateTime.MinValue, x => x.a.DOutputTime == dto.DClassDate)
             .WhereIf(!string.IsNullOrEmpty(dto.CWorkCenter), x => x.a.CWorkCenter == dto.CWorkCenter)
             .WhereIf(dto.CLine.IsNotNullOrEmpty(),x=> x.a.CLineNm == dto.CLine)
                    .ToList()
                    .GroupBy(x => x.a)
                    .Select(x => { x.Key.UseAllAmt = x.Sum(w => w.NConsumeWgt); 
                        x.Key.CEvalType = x.FirstOrDefault()?.CEvalType;
                        x.Key.CUnit = x.FirstOrDefault()?.CUnit;
                        return x.Key; })
                    .OrderByDescending(x => x.CreateTime).ToList();

            return useTmp;

        }

3.3 两表连接+返回单表数据

csharp 复制代码
var top3243Qry = (from top3240 in op3240lstMain
                  join top3243 in GetDbContext().GetTable<Top3243>() on new { top3240.CPlantId, top3240.CPaperrollNo } equals new { top3243.CPlantId, CPaperrollNo = top3243.CRollNo }
                  select new
                  {
                      top3243
                  })
                  .Select(x =>
                  {
                      return x.top3243;
                  })
                  .ToList();

3.4 单表数据重赋值

csharp 复制代码
  var result = OP2091Service.Proxy.GetStockForPiece(param);
  var matnrs = result.Select(x => x.CMtrlNo).Distinct().ToList();
  var tpa1021List = MoveStockService.Proxy.QueryTpa1021(matnrs);
  result.ForEach(x =>
  {
      x.CCert3 = tpa1021List.Where(y => y.CMatnr == x.CMtrlNo).FirstOrDefault()?.CAtwtb;
  });

3.5 多表+先筛选后连接+重赋值

csharp 复制代码
result = (from a in GetDbContext().GetTable<Top3440>()
          .Where(a => a.CPlantId == cqq.CPlantId
          && a.CProcCd == cqq.CProcCd)
          .WhereIf(string.IsNullOrEmpty(cqq.CMachineId), a => lines.Contains(a.CMachineId))
          .WhereIf(!string.IsNullOrEmpty(cqq.CMachineId), a => a.CMachineId.Equals(cqq.CMachineId))
          .WhereIf(!string.IsNullOrEmpty(cqq.CClassGroup), a => a.CClassGroup.Equals(cqq.CClassGroup))
          .WhereIf(!string.IsNullOrEmpty(cqq.Paperstacknumber), a => a.CPaperPileNo.Contains(cqq.Paperstacknumber))
          .WhereIf(!string.IsNullOrEmpty(cqq.paperbarcode), a => a.CPaperPileBarCode.Contains(cqq.paperbarcode))
          .WhereIf(!string.IsNullOrEmpty(sono), a => a.CSoNo.Equals(sono))
          .WhereIf(cqq.CIsCountNew != null && cqq.CIsCountNew == YN.Y, a => a.CIsCountNew == YN.Y)
          .WhereIf(cqq.CIsCountNew != null && cqq.CIsCountNew == YN.N, a => a.CIsCountNew == YN.N || a.CIsCountNew == null)
          .WhereIf(cqq.dateType == "0", a => a.CreateTime >= cqq.DBegTime && a.CreateTime < cqq.DEndTime.Date.AddDays(1))
          .WhereIf(cqq.dateType == "1", a => a.DInputTime >= cqq.DBegTime.Date && a.DInputTime < cqq.DEndTime.Date.AddDays(1))
join b in GetDbContext().GetTable<Top3450>()
          .WhereIf(!string.IsNullOrEmpty(cqq.CPaperGrow), b => b.CPaperGrow.Equals(cqq.CPaperGrow))
          .WhereIf(cqq.NGramWgt != 0, b => b.NGramWgt == cqq.NGramWgt)
on a.CPaperPileNo equals b.CPaperPileNo
join s in GetDbContext().GetTable<Top3420>()
          .WhereIf(!string.IsNullOrEmpty(cqq.CPaperrollNo), s => s.CPaperrollNo.Contains(cqq.CPaperrollNo))
on a.CBatchNo equals s.CBatchNo
join c in GetDbContext().GetTable<Tpp2010>() on new { a.CSoNo, a.CSoItemNo } equals new { c.CSoNo, c.CSoItemNo } into temp
from d in temp.DefaultIfEmpty()
select new
{
    a,
    CAfterPaperGrow = b.CPaperGrow,
    NAfterGramWgt = b.NGramWgt,
    CAfterSoNo = b.CSoNo + b.COrdPolar,
    CAfterSoItemNo = b.CSoItemNo + b.COrdItemPolar,
    NAfterWgt = b.NWgt,
    b.CPaperStatus,
    b.CReaAS,
    IsChanged = YN.Y,//t.Id,
    saleChannel = d == null ? string.Empty : d.CVbapZzmyfs,
    d.NVbapZzduizhan,
    NSurPackNum=b.NSurPackNum
}).AsEnumerable()
.Select(x =>
{
    var stackPrdDto = ObjectMapper.Map<StackPrdDto>(x.a);
    stackPrdDto.CPaperStatus = x.CPaperStatus;
    stackPrdDto.CAfterPaperGrow = x.CAfterPaperGrow;
    stackPrdDto.CAfterSoNo = x.CAfterSoNo;
    stackPrdDto.CAfterSoItemNo = x.CAfterSoItemNo;
    stackPrdDto.NAfterGramWgt = x.NAfterGramWgt;
    stackPrdDto.NAfterWgt = x.NAfterWgt.GetValueOrDefault() / 1000;
    stackPrdDto.SaleChannel = (SalesType)Enum.Parse(typeof(SalesType), string.IsNullOrEmpty(x.saleChannel) ? "0" : x.saleChannel);
    stackPrdDto.IsChanged = string.IsNullOrEmpty(x.IsChanged) ? YN.N : YN.Y;
    stackPrdDto.CIsLastone = (stackPrdDto.CIsLastone == "1" ? "是" : "否");
    stackPrdDto.CReaAS = x.CReaAS;
    stackPrdDto.NSurPackNum = x.NSurPackNum;
    stackPrdDto.NVbapZzduizhan = x.NVbapZzduizhan;
    return stackPrdDto;
}).Distinct().OrderBy(x => x.CPaperPileNo).ToList();

3.6 两表连接+返回映射数据

csharp 复制代码
   public virtual List<OP3603QryDto> QueryOP3603(ReportQueryDto dto)
   {
       var oP3603QryDtos = new List<OP3603QryDto>();
       var db = GetDbContext();

       var list = from a in db.GetTable<Tax0298>()
                   .Where(x => x.CStatus != ReserveStatus.DELETE)
                   .Where(x => x.DClassDate >= dto.begdate)
                   .Where(x => x.DClassDate <= dto.enddate)
                   .WhereIf(dto.CPlant.IsNotNullOrEmpty(), x => x.CPlantId == dto.CPlant)
                   .WhereIf(dto.CProcCd.IsNotNullOrEmpty(), x => x.CProcCd == dto.CProcCd)
                   .WhereIf(dto.CClassGroup.IsNotNullOrEmpty(), x => x.CClassGroup == dto.CClassGroup)

                  join b in db.GetTable<Top3240>()
                  on a.CPaperPileNo equals  b.CPaperrollNo

                  select new
                  {
                      a,
                      b.CMachineId,
                      b.NBreadthWidth,
                      b.NLength,
                      b.NSurLength,
                      b.CIsused,
                  };

       list.ToList().ForEach(x =>
       {
           x.a.CMachineId = x.CMachineId;
           x.a.NBreadthWidth = x.NBreadthWidth;
           x.a.NLength = x.NLength;
           x.a.NSurLength = x.NSurLength;
           x.a.CIsused = x.CIsused;
           oP3603QryDtos.Add(ObjectMapper.Map<OP3603QryDto>(x.a));
       });

       return oP3603QryDtos;
   }

3.7 多表左连接+重赋值

csharp 复制代码
 public virtual List<ReportQueryOP3631> GetOP3631(QueryParamOP3631 param)
 {
     var list = (from a in GetDbContext().GetTable<Top3240>()
                   .Where(a => a.CPlantId == param.CPlant)
                   .Where(a => a.CProcCd == "NA")
                   .Where(a => a.CreateTime >= param.DStartDate)
                   .Where(a => a.CreateTime < param.DEndDate.AddDays(1))
                   .WhereIf(!string.IsNullOrEmpty(param.CPaperrollNo), a => a.CPaperrollNo == param.CPaperrollNo)
                   .WhereIf(!string.IsNullOrEmpty(param.CBarCode), a => a.CBarCode == param.CBarCode)
                   .WhereIf(!string.IsNullOrEmpty(param.CBatchNo), a => a.CBatchNo == param.CBatchNo)
                 join b in GetDbContext().GetTable<Top3130>()
                     on a.CBarCode equals b.COldBarCode
                 join c in GetDbContext().GetTable<Top3140>()
                     on a.CBarCode equals c.COldBarCode into ac
                 from acSum in ac.DefaultIfEmpty()
                 select new
                 {
                     a,
                     Top3130NReceiveLength = b.NReceiveLength ?? 0,
                     Top3130NWgt = b.NWgt ?? 0,
                     Top3140NLossLength = acSum.NLossLength,
                     Top3140NLossWgt = acSum.NLossWgt,
                 }).AsEnumerable()
.Select(x =>
{
    var queryOP3631 = ObjectMapper.Map<ReportQueryOP3631>(x.a);
    queryOP3631.Top3130NReceiveLength = x.Top3130NReceiveLength;
    queryOP3631.Top3130NWgt = x.Top3130NWgt;
    queryOP3631.Top3140NLossLength = x.Top3140NLossLength;
    queryOP3631.Top3140NLossWgt = x.Top3140NLossWgt;
    return queryOP3631;
}
).ToList();

     //汇总合并数据
     var result = list.GroupBy(x => new { x.CPlantId, x.CBarCode })
        .Select(x =>
        {
            var queryOP3631 = ObjectMapper.Map<ReportQueryOP3631>(x);
            //queryOP3631.Top3130NReceiveLength = x.Sum(a => a.Top3130NReceiveLength);
            //queryOP3631.Top3130NWgt = x.Sum(a => a.Top3130NWgt);
            queryOP3631.Top3140NLossLength = x.Sum(a => a.Top3140NLossLength);
            queryOP3631.Top3140NLossWgt = x.Sum(a => a.Top3140NLossWgt);
            return queryOP3631;

        }).ToList();

     return result;
 }

3.8 两表连接+返回映射DTO

csharp 复制代码
 public virtual List<OP3603QryDto> QueryOP3603(ReportQueryDto dto,string strCBefPaperPileBarCode, string strCPaperPileBarCode)
 {
     var oP3603QryDtos = new List<OP3603QryDto>();
     var db = GetDbContext();

     var list = from a in db.GetTable<Tax0298>()
                 .Where(x => x.CStatus != ReserveStatus.DELETE)
                 .Where(x => x.DClassDate >= dto.begdate)
                 .Where(x => x.DClassDate <= dto.enddate)
                 .WhereIf(dto.CPlant.IsNotNullOrEmpty(), x => x.CPlantId == dto.CPlant)
                 .WhereIf(dto.CProcCd.IsNotNullOrEmpty(), x => x.CProcCd == dto.CProcCd)
                 .WhereIf(dto.CClassGroup.IsNotNullOrEmpty(), x => x.CClassGroup == dto.CClassGroup)
                 .WhereIf(strCBefPaperPileBarCode.IsNotNullOrEmpty(), x => x.CBefPaperPileBarCode == strCBefPaperPileBarCode)
                 .WhereIf(strCPaperPileBarCode.IsNotNullOrEmpty(), x => x.CPaperPileBarCode == strCPaperPileBarCode)

                join b in db.GetTable<Top3240>()
                on a.CPaperPileNo equals  b.CPaperrollNo

                select new
                {
                    a,
                    b.CMachineId,
                    b.NBreadthWidth,
                    b.NLength,
                    b.NSurLength,
                    b.CIsused,
                };

     list.ToList().ForEach(x =>
     {
         x.a.CMachineId = x.CMachineId;
         x.a.NBreadthWidth = x.NBreadthWidth;
         x.a.NLength = x.NLength;
         x.a.NSurLength = x.NSurLength;
         x.a.CIsused = x.CIsused;
         oP3603QryDtos.Add(ObjectMapper.Map<OP3603QryDto>(x.a));
     });

     return oP3603QryDtos;
 }

3.9 两表连接+DB和List

csharp 复制代码
var top3911s = GetDbContext().GetTable<Top3911>()
                .Join(tax3020s,
                   x => x.CHeaderNo,
                   x => x.CHeaderNo, (x, y) => x)
                .Where(x => x.NFeedSurWgt > 0)
                .GroupBy(x => new { x.CMtrlNo, x.CBnPlantId })
                .Select(x => new { sum = x.Sum(t => t.NFeedSurWgt), x.Key.CMtrlNo, x.Key.CBnPlantId }).ToList();

四、项目展示

五、资源链接

相关推荐
方璧4 小时前
限流的算法
java·开发语言
Hi_kenyon4 小时前
VUE3套用组件库快速开发(以Element Plus为例)二
开发语言·前端·javascript·vue.js
曲莫终5 小时前
Java VarHandle全面详解:从入门到精通
java·开发语言
一心赚狗粮的宇叔5 小时前
中级软件开发工程师2025年度总结
java·大数据·oracle·c#
ghie90905 小时前
基于MATLAB GUI的伏安法测电阻实现方案
开发语言·matlab·电阻
Gao_xu_sheng5 小时前
Inno Setup(专业安装/更新 EXE)
开发语言
cplmlm6 小时前
EF Core使用CodeFirst生成postgresql数据库表名以及字段名用蛇形命名法,而类名仍使用驼峰命名
c#
吴声子夜歌6 小时前
Java数据结构与算法——基本数学问题
java·开发语言·windows
wanglei2007087 小时前
生产者消费者
开发语言·python