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踩坑(框架思考)(一)反面教材的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程