c# - 这是在查询后设置更多属性值的好方法吗?
问题描述
这是我在查询后设置更多属性值的方法。请参阅 GetMoreData() 方法,它将在每个细节循环中执行并开始导致性能问题。
有没有更好的方法来做到这一点?我知道在对象实例化期间执行的类构造函数。但是在这种情况下,必须在数据库查询之后设置更多的属性。
注意:这是一个精简版的源代码,只关注重要部分,如果有拼写错误,请接受。
public class OrderHeader
{
// Real database column
public string OrderId { get; set; }
public string ColA { get; set; }
public string ColB { get; set; }
public string PostCode { get; set; }
public decimal TotalWeight { get; set; }
public decimal TotalShipmentFee { get; set; }
}
public class OrderDetail
{
// Real database column
public string OrderId { get; set; }
public string OrderLine { get; set; }
public decimal Weight { get; set; }
public decimal ShipmentFee { get; set; }
// mock-up column for displaly only, not exist in datababse
public string ColA { get; set; }
public string ColB { get; set; }
}
public static List<OrderDetail> GetByItemClass(string itemClass)
{
using (IDbConnection db = new MySqlConnection(connectionStringGoesHere)) {
string sqlCmd = @"SELECT * FROM orderdetail WHERE ItemClass = @ItemClass";
List<OrderDetail> orderDetails = db.Query<OrderDetail>(sqlCmd, new {
@ItemClass = itemClass
}).ToList();
// Get or build or calculate additional properties
for (int i = 0; i < orderDetails.Count; i++) {
orderDetails[i] = GetMoreData(orderDetails);
}
return orderDetails;
}
}
public static List<OrderDetail> GetByItemType(string itemType)
{
using (IDbConnection db = new MySqlConnection(connectionStringGoesHere)) {
string sqlCmd = @"SELECT * FROM orderdetail WHERE ItemType = @ItemType";
List<OrderDetail> orderDetails = db.Query<OrderDetail>(sqlCmd, new {
@ItemType = itemType
}).ToList();
// Get or build or calculate additional properties
for (int i = 0; i < orderDetails.Count; i++) {
orderDetails[i] = GetMoreData(orderDetails);
}
return orderDetails;
}
}
public static OrderDetail GetMoreData(OrderDetail orderDetail)
{
// Performance problem: Need to query order header for every
// single loop even multiple records having the same OrderId
OrderHeader orderHeader = OrderHeaderDal.GetById(orderDetail.OrderId);
// Directly map value
orderDetail.ColA = orderHeader.ColA;
orderDetail.ColB = orderHeader.ColB;
// Calculate value
if (orderHeader.PostCode == "0") {
orderDetail.ShipmentFee = orderDetail.Weight * 1.15;
// More complex to get value from another table
} else {
// Might also cause performance issue for many query loop
Rate rate = RateDal.GetByPostCode(orderHeader.PostCode);
orderDetail.ShipmentFee = orderDetail.Weight * rate.RatePerKg;
}
return orderDetail;
}
解决方案
推荐阅读
- c# - 将占位符变量添加到 appSettings.json 文件
- r - R数据表,如何新建一列,答案取决于DT内的另一列
- csv - 如何反序列化actix Web表单数据并将其序列化为csv文件?
- javascript - 安装公共包时 NPM 显示 403
- c++ - 来自模板函数的意外结果
- computation-theory - NPDA for L= {w ∈ {a,b}*:a 的数量是 b 数量的两倍}
- android - 最小化应用程序上的前台服务销毁
- python - 根据另一个df中的值填充新的pandas df
- python - 在 python 或 tableau 的帮助下合并数据
- c# - 使用 Moq 模拟 ReturnsAsync 以返回 2 个值