C# 中的 linq 之SELECT 与 WHERE踩坑(框架思考)(一)反面教材
2021/7/1 1:50:37
本文主要是介绍C# 中的 linq 之SELECT 与 WHERE踩坑(框架思考)(一)反面教材,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1 var stockMaterials = this._PEService.GetStockMaterial(materialSnList).AsEnumerable().Select(r => new 2 { 3 MaterialCode = r["MaterialCode"]?.ToString(), 4 MaterialName = r["MaterialName"]?.ToString(), 5 MaterialSn = r["MaterialSn"]?.ToString(), 6 MaterialQty = int.MaxValue 7 }).ToList();View Code
过程:查库返回DataTable类型 ,转化成枚举查询 ,返回一个枚举型IEumerable类型(解释意思是可枚举的)接着转化成ToList(),
注意点:起先我用他的原List名去接收,结果拿到的是IEumerable类型,这时发现这个materialList不能使用List带的. ForEach() 方法
比较:比较传统的分支循环写法,Linq很方便,给程序员带来的便利;但是有个问题就是,用linq耦合很严重,即使你有注释,别人改你的BUG根本看不懂,并不知道你随手造的匿名对象和随手用的匿名对象到底要干嘛,总的来说就是可读性不高。关于方便 与 逻辑性的思考 我想代码应该是越简单性能越稳定,一味追求linq反而增加工作量。
一个知识点多咀嚼一下总是好的,再来一个例子~~
1 var result = materialSnList.Select(materialSn => 2 { 3 string msg = ""; string msgCode = ""; bool isOk = true; string materialCode = ""; int stepNo = -1; 4 //bool tempFlag = false; 5 var tempMaterials = stockMaterials.Where(m => m.MaterialSn == materialSn).ToList(); 6 if (tempMaterials.Count == 0) 7 { 8 msg = "码不存在"; msgCode = "11"; isOk = false; 9 } 10 else if (tempMaterials.Count > 1) 11 { 12 msg = "库存异常"; msgCode = "21"; isOk = false; 13 } 14 else 15 { 16 materialCode = tempMaterials[0].MaterialCode; 17 if (tempMaterials[0].MaterialQty < 1) 18 { 19 msg = "库存不足"; msgCode = "22"; isOk = false; 20 } 21 foreach (var step in workInfo.CrfStepList) 22 { 23 var mConfig = step.MaterialList.FirstOrDefault(mc => mc.MaterialCode == materialCode); 24 if (mConfig != null) 25 { 26 stepNo = step.StepNo; 27 break; 28 } 29 } 30 if (stepNo < 0) 31 { 32 //tempFlag = true; 33 msg = "非该工位物料"; msgCode = "12"; isOk = false; 34 } 35 } 36 return new OutCheckLoadedMaterialDTO 37 { 38 StepNo = stepNo, 39 MaterialSn = materialSn, 40 MaterialCode = materialCode, 41 IsOk = isOk, 42 MsgCode = msgCode, 43 MsgDesc = msg 44 };View Code
说实话,这种代码写出来是不是看都不想看,功能实现了,但除了自己,谁看得懂,流程异常,BUG谁又能改,一个就算了 7个 8个呢
第二个缺点就是校验写的过于分散且没有必要,不打注释
var result = materialSnList.Select(materialSn => { string msg = ""; string msgCode = ""; bool isOk = true; string materialCode = ""; int stepNo = -1; //bool tempFlag = false; var tempMaterials = stockMaterials.Where(m => m.MaterialSn == materialSn).ToList(); if (tempMaterials.Count == 0) { msg = "码不存在"; msgCode = "11"; isOk = false; } else if (tempMaterials.Count > 1) { msg = "库存异常"; msgCode = "21"; isOk = false; } else { materialCode = tempMaterials[0].MaterialCode; if (tempMaterials[0].MaterialQty < 1) { msg = "库存不足"; msgCode = "22"; isOk = false; } foreach (var step in workInfo.CrfStepList) { var mConfig = step.MaterialList.FirstOrDefault(mc => mc.MaterialCode == materialCode); if (mConfig != null) { stepNo = step.StepNo; break; } } if (stepNo < 0) { //tempFlag = true; msg = "非该工位物料"; msgCode = "12"; isOk = false; } } return new OutCheckLoadedMaterialDTO { StepNo = stepNo, MaterialSn = materialSn, MaterialCode = materialCode, IsOk = isOk, MsgCode = msgCode, MsgDesc = msg };
//// 暂屏蔽 //if(tempFlag) //{ // return new OutCheckLoadedMaterialDTO // { // StepNo = stepNo, // MaterialSn = materialSn, // MaterialCode = materialCode, // IsOk = isOk, // MsgCode = msgCode, // MsgDesc = msg // }; //} //else //{ // return new OutCheckLoadedMaterialDTO // { // StepNo = stepNo, // MaterialSn = materialSn, // MaterialCode = materialCode, // IsOk = true, // MsgCode = "", // MsgDesc = $"{msgCode}:{msg}" // }; //} }).ToList();
这篇关于C# 中的 linq 之SELECT 与 WHERE踩坑(框架思考)(一)反面教材的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID
- 2024-01-23用CI/CD工具Vela部署Elasticsearch + C# 如何使用
- 2024-01-23.NET开源的简单、快速、强大的前后端分离后台权限管理系统