C# 中的 linq 之SELECT 与 WHERE踩坑(框架思考)(一)反面教材

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反而增加工作量。

 

一个知识点多咀嚼一下总是好的,再来一个例子~~

C# 中的 linq 之SELECT 与 WHERE踩坑(框架思考)(一)反面教材
 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个呢

第二个缺点就是校验写的过于分散且没有必要,不打注释

众所周知,swith case 结构性,可读性比if 好,if里面代码乱钻,此处可改。

C# 中的 linq 之SELECT 与 WHERE踩坑(框架思考)(一)反面教材

上一篇:Photoshop为外景人物图片加上纯美的暗调青色调


下一篇:Photoshop 漂亮的彩色光影翅膀