1.
查询接口:建议使用IEnumerable
更新、创建接口:不要使用IEnumerable(maybe 接口会重复调用);建议使用可以讲结果保存到内存中的类型(like:IList、IDictionary)
var result = _serviceItemConsumeRecordSvc.Add(consumeResult).ToList(); //if _serviceItemConsumeRecordSvc.Add return as IEnumerable<object> //warn,first call Add():result.Any() if (result == null || !result.Any()) { var msg = $"no serviceItemConsumeRecord can be added"; _loger.Warn(msg, consumeResult ); yield return new SPOSpendingActionResponseItem() { Sucess = false, Message = msg }; continue; } #endregion #region return //warn,second call Add(): foreach (var itemResult in result) foreach (var itemResult in result) { //…… } #endregion
2.
foreach 循环中 yield return 之后,记得添加:continue
非 foreach 循环中 :返回 yield break;(yield return null之后,后续代码仍旧会执行)
public IEnumerable<SPOUsedSearchExtendResponseItem> UsedRecordFullSearch(SPOUsedSearchExtendRequest req) { var usedRecords = UsedRecordsSearch(req); if (usedRecords == null || usedRecords.Data == null || !usedRecords.Data.Any()) { //warn :use "yield break" instead of "yield return null"(; //otherwise [ var consumerRecordLK = usedRecords.Data.ToLookup(_ => _.ProduceRecordNumber);] will execute yield break; } var consumerRecordLK = usedRecords.Data.ToLookup(_ => _.ProduceRecordNumber); //…… }
#region return foreach (var itemResult in result) { if (!itemResult.IfSuccess || itemResult.SICRs == null || !itemResult.SICRs.Any()) { yield return new SPOSpendingActionResponseItem() { Sucess = itemResult.IfSuccess, SICR = itemResult.SICRs!=null? itemResult.SICRs.ToList():null, Message = itemResult.Message }; // warn: // if: in foreach, yield return & not end continue // then:【 var produceRecordNumbers = itemResult.SICRs.Select(_ => _.ProduceRecordNumber); 】will execute,instead of skip to foreach continue; } var produceRecordNumbers = itemResult.SICRs.Select(_ => _.ProduceRecordNumber); //…… } #endregion