系列文章
【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();