linq 如何在ASP.Net MVC C#中循环遍历IEEEList,如果有任何重复项,则对每个重复项的值求和并删除重复项

xoefb8l8  于 2023-11-14  发布在  .NET
关注(0)|答案(2)|浏览(124)

我有一个库存使用页面,其中填充了我在某段时间内使用的项目列表(像一个月左右)。有一个很好的项目是重复的,我试图基本上把一个按钮的视图页面(一个IELTS列表)这将填充一个pdf的项目列表和他们的总数。我不知道的是如何通过项目列表循环,如果有任何重复,获取“AmtTaken”值并将它们相加,然后删除重复项,其中每个项只显示一次,但“AmtTaken”总数将相加在一起。我现在没有太多代码可以执行,因为我被卡住了,正在试图找出执行此操作的最佳方法。它来自一个名为“Inventory Usage”的数据库表。
这是我的模型:

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 string Amt_Taken { get; set; }           
       [Display(Name = "Submitted?")]
       public Nullable<bool> Submitted { get; set; }
   }

字符串
因此,我正在寻找的重复项是任何具有相同Item_Code的项,然后如果有重复项,则对所有Item_Taken值进行求和。我还希望它列出所有没有重复项的项。我目前如何设置它是针对“Submitted”== false的所有项。因此,使用此模型,如果有复制品的话,身份证就不一样了,所以这是另一件让我困惑的事情。
这是我的视图页面:

@model IEnumerable<MyApp.Models.InventoryUsage>

     <div class="wrapper">
         <table class="table">
             <tr>
                 <th>
                     Item/RM Code
                 </th>
                 <th>
                     Amt Taken
                 </th>
                 <th>
                     Submitted? (Y/N)
                 </th>
                 <th></th>
             </tr>

             @foreach (var item in Model)
             {
                 <tr>
                     <td>
                         @Html.DisplayFor(modelItem => item.Item_RM_Code)
                     </td>
                     <td>
                         @Html.DisplayFor(modelItem => item.Amt_Taken)
                     </td>
                     <td>
                         @if (item.Submitted_ == true)
                         {
                             <label class="lbl-yes">Yes</label>
                         }
                         else
                         {
                             <label class="lbl-no">No</label>
                         }
                     </td>
                     <td>
                         @Html.ActionLink("Generate List", "GetTotals", new { not sure what to put here yet }) |
                         @Html.ActionLink("Edit", "Edit", new { id = item.ID }) |
                         @Html.ActionLink("Delete", "Delete", new { id = item.ID })
                     </td>
                 </tr>
             }
         </table>
     </div>


而对于我的控制器,是我没有太多的代码,因为我完全难倒了。

public ActionResult Index()
    {
        var usage = from u in db.InventoryUsage
                    select u;

        return View(usage.Where(u => u.Submitted_ == false).ToList());
    }

    public ActionResult GetTotals()
    {
        var list = db.InventoryUsage.Where(x => x.Submitted == false).ToList();

        //Stuck on this part//

    }


任何建议或指导将不胜感激!

jckbn6z7

jckbn6z71#

使用GroupBy并对结果求和:

IEnumerable<InventoryUsage> usages = ...;

var aggregatedUsages = usages.GroupBy( iu => iu.Item_Code )
    .Select( g => new
    {
        Item_Code = g.Key,
        Amt_Taken = g.Select( iu => Convert.ToInt32( iu.Amt_Taken ) )
            .Sum();
    } );

字符串
您没有指定如何处理相同Item_CodeSubmitted值中的不匹配。如果您希望按物料代码和已提交/未提交值汇总金额,则可以将GroupBy键的这一部分设置为:

usages.GroupBy( iu => new { iu.Item_Code, iu.Submitted } )


然后投影这些属性:

.Select( g => new
{
    Item_Code = g.Key.Item_Code,
    Submitted = g.Key.Submitted,
    Amt_Taken = ...,
} )

uklbhaso

uklbhaso2#

我终于能让这个工作了。@dbc和@Moho,非常感谢你们俩!你给我指出了正确的方向,在研究了更多关于分组方法的东西之后,我最终只是对你的建议做了一些小的调整。出于某种原因,它不允许我对我的数据库实体模型这样做,因为它使用了一个通用的列表,所以我创建了另一个名为UsageTotalsModel的模型类,并添加了来自Inventory Usage Model的相关字段。我猜,由于这不是一个数据库实体模型,它可以使用此函数使用的通用列表。以下是我添加的新模型:

public class UsageTotalsModel
  {
      public UsageTotalsModel() { }

      public string Item_Code { get; set; }
      [DisplayFormat(DataFormatString = "{0:0.###}")]
      public Nullable<decimal> Amt_Taken { get; set; }
      public string UnitOfMeasure { get; set; }       
      public Nullable<bool> Submitted { get; set; }
      public InventoryUsage Usage { set; get; }
  }

字符串
所以在我的控制器中,我只是从Inventory Usage中提取数据并将其添加到UsageTotalsModel中。这修复了我一直收到的错误消息。

public ActionResult GetTotals()
    {
        var usage = from u in db.InventoryUsage
                    where u.Submitted == false
                    group u by u.Item_Code into g
                    orderby g.Key
                    select new UsageTotalsModel() { Item_Code = g.Key, Amt_Taken = g.Sum(u => u.Amt_Taken) };
                 
        var result = usage.ToList();
        return new ViewAsPdf("GetTotals", result) { PageOrientation = Rotativa.Options.Orientation.Portrait };
    }


现在我唯一的问题是,与小数点的项目,是自动四舍五入到最近的十分之一,所以在一些金额的地方,它是0.02磅,它是显示为0.但这是一个不同的问题,如果我卡住了,我会发布另一个问题,但我应该能够弄清楚.无论如何,谢谢你的帮助!我从来没有想过要做分组和选择方法。我在网上找到的东西似乎令人困惑,不确定它是否适用于我,但感谢你们所有人,你们让它变得有意义!

相关问题