Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要帮助降低用于构造JSON字符串的LINQ查询的圈复杂度吗_C#_Json_Linq_Json.net_Cyclomatic Complexity - Fatal编程技术网

C# 需要帮助降低用于构造JSON字符串的LINQ查询的圈复杂度吗

C# 需要帮助降低用于构造JSON字符串的LINQ查询的圈复杂度吗,c#,json,linq,json.net,cyclomatic-complexity,C#,Json,Linq,Json.net,Cyclomatic Complexity,我有5种不同的数据源(request、lsitCC、listSEDI、listSEDIFees和XMLRoot加载到各自的C#Array list对象中)。我需要通过基于特定条件组合来自所有这些源的数据来构造JSON请求。我使用NewtonSoft.JSON用C#编写了以下代码。这个LINQ查询的圈复杂度大约为40,这一点更高。有人能就如何降低复杂性提出建议吗。提前谢谢。 我假设查询是相当用户可读的,请让我知道是否需要内联注释 var input = from RequestNode i

我有5种不同的数据源(request、lsitCC、listSEDI、listSEDIFees和XMLRoot加载到各自的C#Array list对象中)。我需要通过基于特定条件组合来自所有这些源的数据来构造JSON请求。我使用NewtonSoft.JSON用C#编写了以下代码。这个LINQ查询的圈复杂度大约为40,这一点更高。有人能就如何降低复杂性提出建议吗。提前谢谢。 我假设查询是相当用户可读的,请让我知道是否需要内联注释

    var input = from RequestNode in request
              select new
              {
                  Documents = (from objCC in lsitCC
                               where objCC.ID == RequestNode.ID
                               select new
                               {
                                   Request = (from objSEDI in listSEDI
                                                         where objSEDI.ID == objCC.ID && RequestNode.POSTAL.Count(p => p.PID == objSEDI.PID) > 0
                                                         join Config in RequestNode.POSTAL on objSEDI.PID equals Config.PID
                                                         select new
                                                         {
                                                             ReqItem = (Config.ReqItem == null) ? "" : Config.ReqItem,
                                                             Code = (RequestNode.Code == null) ? "" : RequestNode.Code,
                                                             Camp = (RequestNode.Camp == null) ? "" : RequestNode.Camp,
                                                             CCT = new
                                                             {
                                                                 ID = (objCC.ID == null) ? "" : objCC.ID,
                                                                 Band = (RequestNode.Band == null) ? "" : RequestNode.Band,
                                                                 Context = (RequestNode.Context == null) ? 0 : RequestNode.Context,
                                                                 IsActive = (RequestNode.IsActive == null) ? false : RequestNode.IsActive,
                                                                 MaxLimit = (objCC.MaxLimit == null) ? 0 : objCC.MaxLimit,
                                                                 MinLimit = (objCC.MinLimit == null) ? 0 : objCC.MinLimit
                                                             },
                                                             User = RequestNode.User,
                                                             POSTAL = new
                                                             {
                                                                 PID = (objSEDI.PID == null) ? "" : objSEDI.PID,
                                                                 Type = (Config.Type == null) ? "" : Config.Type,
                                                                 Amount = (Config.Amount == null) ? 0 : Config.Amount,
                                                                 IsValid = (Config.IsValid == null) ? false : Config.IsValid,
                                                                 Code = (Config.Code == null) ? "" : Config.Code,                                                                        
                                                                 Infos = new
                                                                 {
                                                                     Info = (from objRoot in XMLRoot
                                                                             where objRoot.ID == objCC.ID && objRoot.Channel == "Channel1" && objRoot.Group == "GROUP_1" && objRoot.Code == Config.Type.Substring(0, 3) && objRoot.PIDCode == Config.Type.Substring(3, 1)
                                                                             select new
                                                                             {
                                                                                 InfoFrom = (objRoot.InfoFrom == null) ? "" : objRoot.InfoFrom,
                                                                                 Selection = (objRoot.Handling == null) ? "" : objRoot.Selection,
                                                                                 Rate = (objRoot.Rate == null) ? "" : objRoot.Rate                                                                                         
                                                                             })
                                                                 },
                                                                 POSTALFee = from objSEDIFee in listSEDIFees
                                                                              where objSEDIFee.ID == objCC.ID && objSEDIFee.PID == objSEDI.PID
                                                                              select new
                                                                              {
                                                                                  BaseValue = (objSEDIFee.BaseValue == null) ? 0 : objSEDIFee.BaseValue,
                                                                                  UpdatedValue = (objSEDIFee.UpdatedValue == null) ? 0 : objSEDIFee.UpdatedValue,
                                                                                  BaseType = (objSEDIFee.BaseType == null) ? "" : objSEDIFee.BaseType,
                                                                                  UpdatedType = (objSEDIFee.UpdatedType == null) ? 0 : objSEDIFee.UpdatedType
                                                                              },
                                                                 OutputRoot = new
                                                                 {
                                                                     Output = from output in outputroot
                                                                             select new
                                                                             {
                                                                                 Type = 0,
                                                                                 SubType = 0,
                                                                                 OutputReference = 0                                                                                        
                                                                             }
                                                                 }
                                                             },

                                                         })
                               })
              };
    var streamRead = JsonConvert.SerializeObject(input, Newtonsoft.Json.Formatting.Indented);

这似乎只是向代码库添加适当数量的翻译器的一个例子。是的,翻译人员很乏味,但是如果你觉得在这里的一个查询中有太多的逻辑,我建议你应该这样做

这意味着你要么放弃anon类型,要么接受dynamic关键字(这样行吗?!)

您可能还需要查看某种构建模式或中间状态

进一步检查后,您似乎在查询中途引入了一些全局变量,例如
XMLRoot
&
listSEDIFees
。如果这更明确,可能会更好。您还可以通过使用where子句的静态部分(
objRoot.Channel==“Channel1”&&objRoot.Group==“Group_1”
)预过滤
XMLRoot
),而不是每次都重新运行,从而减少过多的工作。也许像

var channel1Group1Info = XMLRoot.Where(objRoot=>objRoot.Channel == "Channel1" && objRoot.Group == "GROUP_1").ToArray();
剩下的我一次只挑选一件,减少了这个查询所做的工作量