ASP.NET MVC C#实现IEnumerable列表去重并求和Amt_Taken
解决方案
1. 先修正模型的类型问题
你模型里的Amt_Taken是string类型,没法直接做求和计算,优先建议改成数值类型(比如decimal,适合库存数量场景):
public partial class InventoryUsage { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ID { get; set; } [Display(Name = "Item Code")] public string Item_Code { get; set; } [Display(Name = "Amt Taken")] public decimal Amt_Taken { get; set; } // 替换为decimal类型 [Display(Name = "Submitted?")] public bool? Submitted { get; set; } }
如果数据库里确实只能存字符串,那分组时要加转换逻辑,还要处理格式错误(后面代码会说明)。
2. 实现GetTotals的分组求和逻辑
先创建一个ViewModel专门存汇总结果,避免直接复用原模型:
public class InventoryUsageTotal { [Display(Name = "Item Code")] public string Item_Code { get; set; } [Display(Name = "Total Amt Taken")] public decimal Total_Amt_Taken { get; set; } }
然后完善控制器里的GetTotals方法:
public ActionResult GetTotals() { var usageList = db.InventoryUsage.Where(x => x.Submitted == false).ToList(); // 按Item_Code分组,计算每组的总领取量 var totals = usageList .GroupBy(u => u.Item_Code) .Select(g => new InventoryUsageTotal { Item_Code = g.Key, Total_Amt_Taken = g.Sum(u => u.Amt_Taken) // 若Amt_Taken是string类型,替换为下面的代码: // Total_Amt_Taken = g.Sum(u => decimal.TryParse(u.Amt_Taken, out var amt) ? amt : 0) }) .ToList(); // 返回汇总视图展示数据,后续再集成PDF生成 return View(totals); }
3. 调整视图
新建汇总页面视图(比如Views/你的控制器名/GetTotals.cshtml)
@model IEnumerable<MyApp.Models.InventoryUsageTotal> <div class="wrapper"> <h2>库存领取汇总</h2> <table class="table"> <tr> <th>@Html.DisplayNameFor(model => model.Item_Code)</th> <th>@Html.DisplayNameFor(model => model.Total_Amt_Taken)</th> </tr> @foreach (var item in Model) { <tr> <td>@Html.DisplayFor(modelItem => item.Item_Code)</td> <td>@Html.DisplayFor(modelItem => item.Total_Amt_Taken)</td> </tr> } </table> <!-- 添加PDF生成按钮,依赖第三方库实现 --> @Html.ActionLink("生成PDF", "GenerateInventoryPdf") </div>
修改原Index视图的按钮
把原视图里的Generate List链接改成如下,无需传参数,GetTotals会自动筛选未提交的记录:
@Html.ActionLink("生成汇总列表", "GetTotals") |
4. 集成PDF生成(可选)
可以用Rotativa.AspNetCore(适用于ASP.NET Core)或iTextSharp(传统ASP.NET)实现PDF生成,这里举Rotativa的例子:
- 安装NuGet包:
Install-Package Rotativa.AspNetCore - 控制器中添加生成PDF的方法:
public IActionResult GenerateInventoryPdf() { var usageList = db.InventoryUsage.Where(x => x.Submitted == false).ToList(); var totals = usageList .GroupBy(u => u.Item_Code) .Select(g => new InventoryUsageTotal { Item_Code = g.Key, Total_Amt_Taken = g.Sum(u => u.Amt_Taken) }) .ToList(); // 以GetTotals视图为模板生成PDF return new ViewAsPdf("GetTotals", totals) { FileName = "库存领取汇总.pdf", PageSize = Rotativa.AspNetCore.Options.Size.A4, PageOrientation = Rotativa.AspNetCore.Options.Orientation.Portrait }; }
额外注意事项
- 如果
Amt_Taken必须保留字符串类型,一定要用decimal.TryParse做转换,避免格式错误导致程序崩溃。 - 分组前可以过滤掉空的
Item_Code,避免无效分组:.Where(u => !string.IsNullOrEmpty(u.Item_Code)).GroupBy(...)
内容的提问来源于stack exchange,提问作者Kip M.
相关产品推荐
相关产品推荐

