You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的例子:

  1. 安装NuGet包:Install-Package Rotativa.AspNetCore
  2. 控制器中添加生成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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:58:11