对持有相同 ID 的数量求和 c#

Sum the Quantity which holds the same ID c#

有一个带有订单数据 table 的 ASP.NET MVC 应用程序,table 包含订单部件 ID 和订单数量。

所以之前的开发者不知何故将订单数量设置为字符串类型。

现在对于一个报告,我想根据相同的零件 ID 获得数量的总和并显示它,但它不起作用。

你能帮我解决这个问题吗?

foreach(var item in rData) {
  try {
    if (db.OrderTable.Any(u => u.PartNo_Id == item.Id)) {

      item.TotalOrderQty = db.OrderTable.Where(x => x.PartNo_Id == item.Id).Sum(x => x.OrderQty);
    }

  } catch (Exception ex) {

    throw ex;
  }

}

(x=>x.OrderQty)

上的错误是 cannot implicitly convert type 'string' to 'long'

如果您的 db 对象是一个 OR-Mapper 到真实数据库的对象,您将进行大量可以优化的查询,因为您首先询问列表中的每个项目,如果数据可用,然后尝试查询这些信息。一次性请求数据(如果不是数百万行)并在客户端计算总和会更有效。

也许这张草图可以帮到你:

// Define matching Ids to read from database
var idsToSearch = rData.Select(item => item.Id);

var matchingOrders = db.OrderTable
    // Define criteria, which data has to be fetch.
    .Join(idsToSearch, order => order.PartNo_Id, id => id, (order, id) => order)
    // Prepare data on the server side to be already being grouped.
    .GroupBy(order => order.PartNo_Id)
    // Load data from the server to the client
    .AsEnumerable()
    // Parse and summarize the data on the client side.
    .Select(group => (group.Key, group.SelectMany(order => int.Parse(order.OrderQty).Sum())
    .ToList();

根据您的模型,如果 table 包含很多(在此请求中不需要的)列。另请注意,此代码未经测试,可能包含一些愚蠢的拼写错误或类似错误,但它应该为您提供解决问题的良好起点。

更新(在服务器端将字符串转换为 int)

感谢 Panagiotis 的评论,EF 支持转换方法并将它们转换为相应的 SQL 方法。由于这个事实,一切都可以在服务器端完成。这可能看起来像这样:

var matchingOrders = db.OrderTable
    .Join(idsToSearch, order => order.PartNo_Id, id => id, (order, id) => order)
    .GroupBy(order => order.PartNo_Id)
    .Select(group => (group.Key, group.SelectMany(order => Convert.ToInt32(order.OrderQty).Sum())
    .ToList();