[TOC]
方法
减少嵌套
更改前
public CommonResponse SaveTest(Order order){
if(order!=null){
//业务逻辑
if(order.ID>0){
orderService.EditOrder(order);
}else{
orderService.AddOrder(order);
}
}else{
return new CommonResponse(false,"订单不能为空");
}
}
更改后
public CommonResponse SaveTest(Order order){
if(order==null) return new CommonResponse(false,"订单不能为空");
//业务逻辑
if(order.ID>0){
orderService.EditOrder(order);
}else{
orderService.AddOrder(order);
}
}
判断提前,聚焦业务逻辑,减少嵌套,方便维护
职责唯一
方法要注意职责唯一,不要往一个方法中写入过多的代码,否则他人难以维护。
注意提取一些小方法(注重方法的命名和注释!),方便维护和公用,一般主体流程的函数都是有多个小的方法组装而成。
示例
SalesDeliveryOrderManager类的AddSalesDeliveryOrderFromSalesOrder方法
一个方法多达150+行,十分不好维护
public class SalesDeliveryOrderManager : BaseManager
{
//...
public CommonResponse AddSalesDeliveryOrderFromSalesOrder(int salesOrderId)
{
if (salesOrderId <= 0) return new CommonResponse(false, "销售订单不存在,请检查");
int operatorId = ToothFacModel.Model.Globalparameter.s_OperatorId;
string operatorName = ToothFacModel.Model.Globalparameter.s_OperatorName;
string version = ToothFacModel.Model.Globalparameter.s_Version;
string computerName = ToothFacModel.Model.Globalparameter.s_ComputerName;
using (var serviceFactory = new ServiceFactory())
{
var salesOrderService = serviceFactory.GetService<QueryInterface.DAL.ProductMgt.SalesOrderService>();
var salesOrderDetailService = serviceFactory.GetService<SalesOrderDetailService>();
var saleService = serviceFactory.GetService<DAL.WareHouseMgt.SaleService>();
var salesDeliveryOrderService = serviceFactory.GetService<SalesDeliveryOrderService>();
var salesDeliveryOrderDetailService = serviceFactory.GetService<SalesDeliveryOrderDetailService>();
var salesOrderOperationLogService = serviceFactory.GetService<SalesOrderOperationLogService>();
var salesReturnOrderService = serviceFactory.GetService<SalesReturnOrderService>();
var salesOrder = salesOrderService.SelectSalesOrder(salesOrderId);
if (salesOrder == null) return new CommonResponse(false, "销售订单不存在,请检查");
if (salesOrder.AuditStatus != (int)SalesOrderAuditStatus.审核通过) return new CommonResponse(false, "销售订单需要进行审核,请检查");
if (salesOrder.DiscountAuditStatus == (int)SalesOrderDiscountAuditStatus.待审核 || salesOrder.DiscountAuditStatus == (int)SalesOrderDiscountAuditStatus.不通过)
{
return new CommonResponse(false, "销售订单需要进行折扣审核,请检查");
}
var now = salesOrderService.GetCurrentDate();
return serviceFactory.Database.UsingTransaction(System.Data.IsolationLevel.ReadCommitted, transaction =>
{
//如果已有流程中的销售发货单不能再添加销售发货单!
var existDeliveryOrder = salesDeliveryOrderService.PartialSelectSalesDeliveryOrders(new SelectSalesDeliveryOrdersParameter
{
SalesOrderID = salesOrder.ID,
IsHistorical = false
}, "ID").FirstOrDefault();
var existReturnOrder = salesReturnOrderService.PartialSelectSalesReturnOrders(new SelectSalesReturnOrdersParameter
{
SalesDeliveryOrderID = existDeliveryOrder?.ID ?? 0,
IsHistorical = false
}, "ID").FirstOrDefault();
if (existDeliveryOrder != null && existReturnOrder == null)
{
return new CommonResponse(false, "不能重复生成发货单,请检查");
}
//将已有的发货单修改为历史单状态
if (existDeliveryOrder != null && existReturnOrder != null)
{
salesDeliveryOrderService.PartialUpdateSalesDeliveryOrder(new ToothFacModel.Entity.ProductMgt.SalesDeliveryOrder
{
ID = existDeliveryOrder?.ID ?? 0,
IsHistorical = true
}, "IsHistorical");
}
//获取编号
var deliveryNo = "F" + now.ToString("yyMMdd") + "0001";
var maxNo = salesDeliveryOrderService.SelectDailyMaxNo(now);
if (!string.IsNullOrEmpty(maxNo))
{
var maxNum = "000" + (int.Parse(maxNo.Substring(maxNo.Length - 4, 4)) + 1);
deliveryNo = "F" + now.ToString("yyMMdd") + maxNum.Substring(maxNum.Length - 4, 4);
}
//添加主表
var salesDeliveryOrder = new ToothFacModel.Entity.ProductMgt.SalesDeliveryOrder
{
DeliveryNo = deliveryNo,
SalesOrderID = salesOrder.ID,
CustomNum = salesOrder.CustomNum,
HospitalId = salesOrder.HospitalId,
DoctorId = salesOrder.DoctorId,
PatientName = salesOrder.PatientName,
AcceptDate = salesOrder.AcceptDate,
PlanDate = salesOrder.PlanDate,
FinishDate = salesOrder.FinishDate,
DeliveryTime = salesOrder.DeliveryTime,
WearTime = salesOrder.WearTime,
InputDate = salesOrder.InputDate,
InputerId = salesOrder.InputerId,
DeliveryOrderRemark = salesOrder.DeliveryOrderRemark,
DeliveryRemind = salesOrder.DeliveryRemind,
TotalPrice = salesOrder.TotalPrice,
OriginalTotalPrice = salesOrder.OriginalTotalPrice,
AuditStatus = (int)SalesOrderAuditStatus.待审核,
PrintState = (int)SalesOrderPrintState.未打印,
SalesRange = salesOrder.SalesRange,
IsDiscount = salesOrder.IsDiscount,
DiscountReason = salesOrder.DiscountReason,
DiscountAuditStatus = salesOrder.DiscountAuditStatus,
Guid = Guid.NewGuid(),
CreatorID = operatorId,
CreationTime = now,
IsHistorical = false,
SaleTypeID = salesOrder.SaleTypeID
};
var salesDeliveryOrderId = salesDeliveryOrderService.InsertSalesDeliveryOrder(salesDeliveryOrder);
//添加明细
var salesOrderDetails = salesOrderDetailService.SelectSalesOrderDetails(new SelectSalesOrderDetailsParameter
{
SalesOrderID = salesOrder.ID
});
var salesDeliveryOrderDetails = salesOrderDetails.Select(x => new ToothFacModel.Entity.ProductMgt.SalesDeliveryOrderDetail
{
ID = x.ID,
SortNo = x.SortNo ?? 0,
SalesDeliveryOrderID = salesDeliveryOrderId,
ProductID = x.ProductID,
PJID = x.PJID,
Quantity = x.Quantity ?? 0,
OriginalUnitPrice = x.OriginalUnitPrice ?? 0,
OriginalSumPrice = x.OriginalSumPrice ?? 0,
UnitPrice = x.UnitPrice ?? 0,
SumPrice = x.SumPrice ?? 0,
NoTaxUnitPrice = x.NoTaxUnitPrice ?? 0,
NoTaxSumPrice = x.NoTaxSumPrice ?? 0,
TaxRate = x.TaxRate,
TaxPrice = x.TaxPrice ?? 0,
DiscountType = x.DiscountType,
DiscountRate = x.DiscountRate,
DiscountAmount = x.DiscountAmount,
UnitId = x.UnitId,
TP1 = x.TP1,
TP2 = x.TP2,
TP3 = x.TP3,
TP4 = x.TP4,
Jaw1 = x.Jaw1,
Jaw2 = x.Jaw2,
Jaw3 = x.Jaw3,
Jaw4 = x.Jaw4,
MissingTP1 = x.MissingTP1,
MissingTP2 = x.MissingTP2,
MissingTP3 = x.MissingTP3,
MissingTP4 = x.MissingTP4,
Color = x.Color,
NeckMiddleCuttingColor = x.NeckMiddleCuttingColor,
ProductState = x.ProductState,
LotNumber = x.LotNumber,
ExpirationDate = x.ExpirationDate,
}).ToList();
salesDeliveryOrderDetailService.InsertSalesDeliveryOrderDetails(salesDeliveryOrderDetails);
//添加日志
salesOrderOperationLogService.InsertSalesOrderOperationLog(new ToothFacModel.Entity.ProductMgt.SalesOrderOperationLog
{
SalesOrderID = salesOrder.ID,
OperationType = (int)SalesOrderOperationLogOperationType.新建,
Content = "销售订单生成销售发货单",
SalesOrderNo = salesOrder.SalesOrderNo,
OperatorId = operatorId,
OperationTime = now,
OperatorName = operatorName,
SoftwareVersion = version,
ComputerName = computerName,
Interface = "销售订单"
});
saleService.UpdateSalesDeliveryOrderIDBySalesOrderId(salesDeliveryOrder);
return new CommonResponse(true, salesDeliveryOrderId.ToString());
}, e => new CommonResponse(false, e.Message));
}
}
//...
}
优化1:
全局变量operatorId和operatorName等,不要定义在方法体中,可以定义成为类SalesDeliveryOrderManager的字段,方便所有方法公用
优化2:
提出获取编号部分代码,封装成为单独的函数
/// <summary>
/// 新增销售发货单时,生成单号
/// </summary>
/// <param name="salesDeliveryOrderService"></param>
/// <param name="now"></param>
/// <returns></returns>
public string GetNewDeliveryNo(SalesDeliveryOrderService salesDeliveryOrderService, DateTime now)
{
var deliveryNo = "F" + now.ToString("yyMMdd") + "0001";
var maxNo = salesDeliveryOrderService.SelectDailyMaxNo(now);
if (!string.IsNullOrEmpty(maxNo))
{
var maxNum = "000" + (int.Parse(maxNo.Substring(maxNo.Length - 4, 4)) + 1);
deliveryNo = "F" + now.ToString("yyMMdd") + maxNum.Substring(maxNum.Length - 4, 4);
}
return deliveryNo;
}
优化3:
验证数据的部分封装成单独函数
/// <summary>
/// 判断销售订单是否可以用来生成发货单
/// </summary>
/// <param name="salesOrder"></param>
/// <param name="existDeliveryOrder"></param>
/// <param name="existReturnOrder"></param>
/// <returns></returns>
public CommonResponse ValidateSalesOrderToDelivery(ToothFacModel.Entity.ProductMgt.SalesOrder salesOrder
, ToothFacModel.Entity.ProductMgt.SalesDeliveryOrder existDeliveryOrder, SalesReturnOrder existReturnOrder)
{
if (salesOrder == null) return new CommonResponse(false, "销售订单不存在,请检查");
if (salesOrder.AuditStatus != (int)SalesOrderAuditStatus.审核通过) return new CommonResponse(false, "销售订单需要进行审核,请检查");
if (salesOrder.DiscountAuditStatus == (int)SalesOrderDiscountAuditStatus.待审核 || salesOrder.DiscountAuditStatus == (int)SalesOrderDiscountAuditStatus.不通过)
{
return new CommonResponse(false, "销售订单需要进行折扣审核,请检查");
}
//如果已有生效的销售发货单(且未被退货) 不能再添加销售发货单!
if (existDeliveryOrder != null && existReturnOrder == null)
{
return new CommonResponse(false, "不能重复生成发货单,请检查");
}
return new CommonResponse(true);
}
优化4:
添加主表的部分封装成单独函数
/// <summary>
/// 销售订单对象转化为销售出货单对象
/// </summary>
/// <param name="salesOrder">销售订单</param>
/// <param name="deliveryNo">销售出货单号</param>
/// <param name="now">当前时间</param>
/// <returns></returns>
private ToothFacModel.Entity.ProductMgt.SalesDeliveryOrder ConvertToSalesDeliveryOrder(ToothFacModel.Entity.ProductMgt.SalesOrder salesOrder, string deliveryNo, DateTime now)
{
return new ToothFacModel.Entity.ProductMgt.SalesDeliveryOrder
{
DeliveryNo = deliveryNo,
SalesOrderID = salesOrder.ID,
CustomNum = salesOrder.CustomNum,
HospitalId = salesOrder.HospitalId,
DoctorId = salesOrder.DoctorId,
PatientName = salesOrder.PatientName,
AcceptDate = salesOrder.AcceptDate,
PlanDate = salesOrder.PlanDate,
FinishDate = salesOrder.FinishDate,
DeliveryTime = salesOrder.DeliveryTime,
WearTime = salesOrder.WearTime,
InputDate = salesOrder.InputDate,
InputerId = salesOrder.InputerId,
DeliveryOrderRemark = salesOrder.DeliveryOrderRemark,
DeliveryRemind = salesOrder.DeliveryRemind,
TotalPrice = salesOrder.TotalPrice,
OriginalTotalPrice = salesOrder.OriginalTotalPrice,
AuditStatus = (int)SalesOrderAuditStatus.待审核,
PrintState = (int)SalesOrderPrintState.未打印,
SalesRange = salesOrder.SalesRange,
IsDiscount = salesOrder.IsDiscount,
DiscountReason = salesOrder.DiscountReason,
DiscountAuditStatus = salesOrder.DiscountAuditStatus,
Guid = Guid.NewGuid(),
CreatorID = _operatorId,
CreationTime = now,
IsHistorical = false,
SaleTypeID = salesOrder.SaleTypeID
};
}
优化5:
添加明细时,需要将销售订单明细转化为销售发货单明细,封装成单独函数
/// <summary>
/// 将销售单明细转化为销售发货单明细
/// </summary>
/// <param name="salesOrderDetail">销售单明细</param>
/// <param name="salesDeliveryOrderId">销售发货单ID</param>
/// <returns></returns>
private ToothFacModel.Entity.ProductMgt.SalesDeliveryOrderDetail ConvertToSalesDeliveryOrderDetail(ToothFacModel.Entity.ProductMgt.SalesOrderDetail salesOrderDetail, int salesDeliveryOrderId)
{
return new ToothFacModel.Entity.ProductMgt.SalesDeliveryOrderDetail
{
ID = salesOrderDetail.ID,
SortNo = salesOrderDetail.SortNo ?? 0,
SalesDeliveryOrderID = salesDeliveryOrderId,
ProductID = salesOrderDetail.ProductID,
PJID = salesOrderDetail.PJID,
Quantity = salesOrderDetail.Quantity ?? 0,
OriginalUnitPrice = salesOrderDetail.OriginalUnitPrice ?? 0,
OriginalSumPrice = salesOrderDetail.OriginalSumPrice ?? 0,
UnitPrice = salesOrderDetail.UnitPrice ?? 0,
SumPrice = salesOrderDetail.SumPrice ?? 0,
NoTaxUnitPrice = salesOrderDetail.NoTaxUnitPrice ?? 0,
NoTaxSumPrice = salesOrderDetail.NoTaxSumPrice ?? 0,
TaxRate = salesOrderDetail.TaxRate,
TaxPrice = salesOrderDetail.TaxPrice ?? 0,
DiscountType = salesOrderDetail.DiscountType,
DiscountRate = salesOrderDetail.DiscountRate,
DiscountAmount = salesOrderDetail.DiscountAmount,
UnitId = salesOrderDetail.UnitId,
TP1 = salesOrderDetail.TP1,
TP2 = salesOrderDetail.TP2,
TP3 = salesOrderDetail.TP3,
TP4 = salesOrderDetail.TP4,
Jaw1 = salesOrderDetail.Jaw1,
Jaw2 = salesOrderDetail.Jaw2,
Jaw3 = salesOrderDetail.Jaw3,
Jaw4 = salesOrderDetail.Jaw4,
MissingTP1 = salesOrderDetail.MissingTP1,
MissingTP2 = salesOrderDetail.MissingTP2,
MissingTP3 = salesOrderDetail.MissingTP3,
MissingTP4 = salesOrderDetail.MissingTP4,
Color = salesOrderDetail.Color,
NeckMiddleCuttingColor = salesOrderDetail.NeckMiddleCuttingColor,
ProductState = salesOrderDetail.ProductState,
LotNumber = salesOrderDetail.LotNumber,
ExpirationDate = salesOrderDetail.ExpirationDate,
};
}
优化6:
返回参数需要返回出货单的主键,所以返回参数改为CommonResponse<int>类型
优化结果
主流程方法里面代码减少,每一步写上注释,方便维护人员理解业务逻辑、定位bug和修改bug
public CommonResponse<int> AddSalesDeliveryOrderFromSalesOrder(int salesOrderId)
{
if (salesOrderId <= 0) return new CommonResponse<int>(false, "销售订单不存在,请检查");
using (var serviceFactory = new ServiceFactory())
{
var salesOrderService = serviceFactory.GetService<QueryInterface.DAL.ProductMgt.SalesOrderService>();
var salesOrderDetailService = serviceFactory.GetService<SalesOrderDetailService>();
var saleService = serviceFactory.GetService<DAL.WareHouseMgt.SaleService>();
var salesDeliveryOrderService = serviceFactory.GetService<SalesDeliveryOrderService>();
var salesDeliveryOrderDetailService = serviceFactory.GetService<SalesDeliveryOrderDetailService>();
var salesOrderOperationLogService = serviceFactory.GetService<SalesOrderOperationLogService>();
var salesReturnOrderService = serviceFactory.GetService<SalesReturnOrderService>();
return serviceFactory.Database.UsingTransaction(System.Data.IsolationLevel.ReadCommitted, transaction =>
{
//获取销售订单
var salesOrder = salesOrderService.SelectSalesOrder(salesOrderId);
//当前已生效的销售发货单
var existDeliveryOrder = salesDeliveryOrderService.PartialSelectSalesDeliveryOrders(new SelectSalesDeliveryOrdersParameter
{
SalesOrderID = salesOrder.ID,
IsHistorical = false
}, "ID").FirstOrDefault();
//当前已生效的销售退货单
var existReturnOrder = salesReturnOrderService.PartialSelectSalesReturnOrders(new SelectSalesReturnOrdersParameter
{
SalesDeliveryOrderID = existDeliveryOrder?.ID ?? 0,
IsHistorical = false
}, "ID").FirstOrDefault();
//数据验证
var validateResult = ValidateSalesOrderToDelivery(salesOrder, existDeliveryOrder, existReturnOrder);
if (!validateResult.Success) return validateResult;
var now = salesOrderService.GetCurrentDate();
//将已有的发货单修改为历史单状态
if (existDeliveryOrder != null && existReturnOrder != null)
{
salesDeliveryOrderService.PartialUpdateSalesDeliveryOrder(new ToothFacModel.Entity.ProductMgt.SalesDeliveryOrder
{
ID = existDeliveryOrder?.ID ?? 0,
IsHistorical = true
}, "IsHistorical");
}
//获取编号
var deliveryNo = GetNewDeliveryNo(salesDeliveryOrderService, now);
//添加主表
var salesDeliveryOrder = ConvertToSalesDeliveryOrder(salesOrder, deliveryNo, now);
var salesDeliveryOrderId = salesDeliveryOrderService.InsertSalesDeliveryOrder(salesDeliveryOrder);
//添加明细
var salesOrderDetails = salesOrderDetailService.SelectSalesOrderDetails(new SelectSalesOrderDetailsParameter
{
SalesOrderID = salesOrder.ID
});
var salesDeliveryOrderDetails = salesOrderDetails.Select(x => ConvertToSalesDeliveryOrderDetail(x, salesDeliveryOrderId)).ToList();
salesDeliveryOrderDetailService.InsertSalesDeliveryOrderDetails(salesDeliveryOrderDetails);
//添加日志
salesOrderOperationLogService.InsertSalesOrderOperationLog(new ToothFacModel.Entity.ProductMgt.SalesOrderOperationLog
{
SalesOrderID = salesOrder.ID,
OperationType = (int)SalesOrderOperationLogOperationType.新建,
Content = "销售订单生成销售发货单",
SalesOrderNo = salesOrder.SalesOrderNo,
OperatorId = _operatorId,
OperationTime = now,
OperatorName = _operatorName,
SoftwareVersion = _version,
ComputerName = _computerName,
Interface = "销售订单"
});
saleService.UpdateSalesDeliveryOrderIDBySalesOrderId(salesDeliveryOrder);
//更新售出单
return new CommonResponse<int>(salesDeliveryOrderId);
}, e => new CommonResponse<int>
{
Success = false,
Message = e.Message
});
}
}
封装继承多态
示例1
foreach (var detail in salesOrder.SalesOrderDetails)
{
detail.ToothPositions = ToothHelper.SetTooth(new SetToothParam
{
TP1 = detail.TP1,
TP2 = detail.TP2,
TP3 = detail.TP3,
TP4 = detail.TP4,
Jaw1 = detail.Jaw1,
Jaw2 = detail.Jaw2,
Jaw3 = detail.Jaw3,
Jaw4 = detail.Jaw4,
MissingTP1 = detail.MissingTP1,
MissingTP2 = detail.MissingTP2,
MissingTP3 = detail.MissingTP3,
MissingTP4 = detail.MissingTP4,
});
}
这里我们发现很多类都有TP1~4 Jaw1~4 MissginTP1~4 并且有一些通用的方法
这里推荐创建一个父类
public class FDIToothPosition
{
public string TP1 { get; set; }
public string TP2 { get; set; }
public string TP3 { get; set; }
public string TP4 { get; set; }
public int Jaw1 { get; set; }
public int Jaw2 { get; set; }
public int Jaw3 { get; set; }
public int Jaw4 { get; set; }
public string MissingTP1 { get; set; }
public string MissingTP2 { get; set; }
public string MissingTP3 { get; set; }
public string MissingTP4 { get; set; }
}
有这几个字段的ViewModel类可以继承该类,泪如
public class SalesOrderView_SalesOrderDetail : FDIToothPosition
然后给ToothHelper增加方法
public static Heng9.ToothDesign.Tooth GetTooth(FDIToothPosition toothPosition)
{
Heng9.ToothDesign.Tooth tooth = Heng9.ToothDesign.Tooth.FromFDIString(toothPosition.TP1, toothPosition.TP2, toothPosition.TP3, toothPosition.TP4,
MarshalToothUpPositions(toothPosition.Jaw1, toothPosition.Jaw2), MarshalToothDownPositions(toothPosition.Jaw3, toothPosition.Jaw4));
SetToothState(tooth, toothPosition.MissingTP1, 1);
SetToothState(tooth, toothPosition.MissingTP2, 2);
SetToothState(tooth, toothPosition.MissingTP3, 3);
SetToothState(tooth, toothPosition.MissingTP4, 4);
return tooth;
}
更改后的代码
foreach (var detail in salesOrder.SalesOrderDetails){
detail.ToothPositions = ToothHelper.GetTooth(detail);
}
示例2
对多个if else 或者 switch case 里面包含复杂业务逻辑的代码
可以考虑多态(扩展代码为主,修改代码为辅)
尤其是各种复杂工具和业务开发,可以考虑进行更好的代码设计与优化
更改前
switch (order.OrderType){
case OrderType.Test1:
//业务1 大量业务逻辑
return 1;
break;
case OrderType.Test2:
//业务2 大量业务逻辑
return 2;
break;
case OrderType.Test3:
//业务3 大量业务逻辑
return 3;
break;
}
//或者
if(order.OrderType==OrderType.Test1){
//业务1 大量业务逻辑
return 1;
}else if(order.OrderType==OrderType.Test2){
//业务2 大量业务逻辑
return 2;
}else if(order.OrderType==OrderType.Test3){
//业务3 大量业务逻辑
return 3;
}
并且条件之后还可能会扩展
更改后
public interface IDealOrderType{
int dealOrderType();
}
public class OrderType1:IDealOrderType{
public int dealOrderType(){
//业务1 大量业务逻辑
return 1;
}
}
public class OrderType2:IDealOrderType{
public int dealOrderType(){
//业务2 大量业务逻辑
return 2;
}
}
public class OrderType3:IDealOrderType{
public int dealOrderType(){
//业务3 大量业务逻辑
return 3;
}
}
// 业务逻辑代码(可以考虑工厂封装)
IDealOrderType dealOrderType;
if(order.OrderType==OrderType.Test1){
dealOrderType=new OrderType1();
}else if(order.OrderType==OrderType.Test2){
dealOrderType=new OrderType2();
}else if(order.OrderType==OrderType.Test3){
dealOrderType=new OrderType3();
}
return dealOrderType.dealOrderType();
LINQ
不少linq语句可以更加直观的反应业务逻辑,并减少嵌套
foreach (var detail in salesOrder.SalesOrderDetails)
{
if (salesOrder.SalesRange == EnumSalesRange.产品销售)
{
var returnDetail = returnDetails.Where(x => x.ProductID == detail.ProductID).FirstOrDefault();
if (returnDetail != null)
{
detail.Checked = true;
detail.ID = returnDetail.ID;
}
else
{
detail.ID = 0;
}
}
else
{
var returnDetail = returnDetails.Where(x => x.PJID == detail.PJID).FirstOrDefault();
if (returnDetail != null)
{
detail.Checked = true;
detail.ID = returnDetail.ID;
}
else
{
detail.ID = 0;
}
}
修改后
foreach (var detail in salesOrder.SalesOrderDetails){
detail.ID = 0;
if (salesOrder.SalesRange == EnumSalesRange.产品销售 && returnDetails.Exists(x => x.ProductID == detail.ProductID))
{
detail.ID = returnDetails.FirstOrDefault(x => x.ProductID == detail.ProductID).ID;
}
else if (salesOrder.SalesRange == EnumSalesRange.经营销售 && returnDetails.Exists(x => x.PJID == detail.PJID))
{
detail.ID = returnDetails.FirstOrDefault(x => x.PJID == detail.PJID).ID;
}
detail.Checked = detail.ID > 0;
}