C# 如何计算乘积之和

C# 如何计算乘积之和,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我有一个动作ViewModel,它显示按产品名称分组的所有产品。但这并没有告诉我每个部门有多少人 假设我在It部门有20台计算机,在管理部门有10台计算机,然后我的代码显示我的产品名称,即“计算机”。 总人数为30人,但不包括it部门和管理部门的人数 服务器或其他产品也是如此 所以我正试图用这个动作来获取每个部门的产品数量。我知道alrteady部门Id和那些部门不是动态的 //这是在我的家庭控制器,这是我的行动,试图得到每个部门的总和 [HttpGet] public ActionResult

我有一个动作ViewModel,它显示按产品名称分组的所有产品。但这并没有告诉我每个部门有多少人

假设我在It部门有20台计算机,在管理部门有10台计算机,然后我的代码显示我的产品名称,即“计算机”。 总人数为30人,但不包括it部门和管理部门的人数

服务器或其他产品也是如此

所以我正试图用这个动作来获取每个部门的产品数量。我知道alrteady部门Id和那些部门不是动态的

//这是在我的家庭控制器,这是我的行动,试图得到每个部门的总和

[HttpGet]
public ActionResult GetStatusOfDepartments(int ProductId, int departmentId )
{
    var products = context.Inventory.Where(x => x.ProductId == ProductId && x.departmentId == departmentId).FirstOrDefault();
    if(products != null)
    {
        return Content(products.Status.ToString());
    }
    else
    {
        return Content("No products");
    }
}
我想在这个ViewModel中调用“GetStatusOfDepartments”操作,但这个givs为空。你能帮我出什么事了吗 要在此ViewModel中调用操作

@model IEnumerable<ProductsInventory.Models.StatusModel>
<table class="table">
    <tr>

        <th>
            Produkt name

        </th>
        <th>
           It-Department

        </th>
        <th>
            Adminstration
        </th>

        <th>
            TotalProducts 

        </th>


    </tr>

    @foreach (var item in Model)
    {
    <tr>

        <td>
            @Html.DisplayFor(modelItem => item.ProductName)
       </td>
        <td>
          // Here I want to call like this
           @Html.Action("GetStatusOfDepartments", "Home", new { ProductId = item.ProductId, departmentId = 1 })
        </td>

        <td>
          // The same Here I want to call like this
           @Html.Action("GetStatusOfDepartments", "Home", new { ProductId = item.ProductId, departmentId = 2 })
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Status)
        </td>


    </tr>
    }

</table>
@model IEnumerable
产品名称
It部门
管理
总产品
@foreach(模型中的var项目)
{
@Html.DisplayFor(modelItem=>item.ProductName)
//我想这样打电话给你
@Action(“GetStatusOfDepartments”,“Home”,新的{ProductId=item.ProductId,departmentId=1})
//这里也是我想这样称呼的
@Action(“GetStatusOfDepartments”,“Home”,新的{ProductId=item.ProductId,departmentId=2})
@DisplayFor(modelItem=>item.Status)
}

在@Html.Action中,第一个参数应该是Action name,第二个参数应该是controller name。您需要更改您的代码以与之匹配。

到目前为止,您所做的工作中有两件事情非常突出

  • 看到ActionResult返回内容()是非常罕见的。这意味着控制器正在向视图提供原始字符串,而这实际上不是控制器的重点
  • 当前,该视图在循环中嵌入了
    @Html.Action()
    请求,这表明该视图没有提供适当的模型
  • 这个问题的标题表明它更多地与数据库查询有关,而不是与MVC有关
  • 目前,单个页面加载将导致许多数据库查询,至少是产品类型数量的两倍。最好尽可能少地执行数据库查询,因为它们通常会对加载每个页面所需的时间产生很大影响
在我试图回答这个问题时,很明显,创建模型需要一个相对复杂的数据库查询。也许您最终使用了上述方法来克服这个问题,因此我将尝试在不使用复杂数据库查询的情况下回答这个问题,同时仍然遵循MVC设计模式(这应该可以避免上述问题)

创建模型

您已经非常清楚要在视图上显示什么。它与数据库模型有很大的不同,因此我们应该创建一个新模型

public class ProductsInDepartments
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public int ITTotal { get; set; }
    public int AdminTotal { get; set; }
    public int Status { get; set; }
}
这只是视图中每个列的一个属性。我想你只有两个部门,它们的名字没有映射到数据库中。如果这是不正确的,那么我会建议一种不同的模式和方法

控制器

控制器需要准备一个模型。在这种情况下,我们将获得所有数据,然后将其转换为我们需要的模型结构:

    public enum Departments  // Enumerating a database key like this can be helpful if the database itself doesn't describe the numbers in a lookup table or something
    {
        IT = 1,
        Admin = 2
    };

    [HttpGet]
    public ActionResult Status()
    {
        var Inventory = context.Inventory.ToList(); // Get all records

        var ViewModel = new List<Models.ProductsInDepartments>();
        foreach (int ProductId in Inventory.Select(e => e.ProductId).Distinct().ToList())
        {
            ViewModel.Add(new Models.ProductsInDepartments()
            {
                ProductId = ProductId,
                ProductName = Inventory.First(e => e.ProductId == ProductId).ProductName,
                AdminTotal = Inventory.Count(e => e.ProductId == ProductId && e.DepartmentId == (int)Department.Admin),
                ITTotal = Inventory.Count(e => e.ProductId == ProductId && e.DepartmentId == (int)Department.IT),
                Status = Inventory.First(e => e.ProductId == ProductId).Status // I'm not sure what you are trying to do with Status, so you might need to change this
            });
        }
        return View(ViewModel);
    }
public enum Departments//
{
它=1,
管理员=2
};
[HttpGet]
公共行动结果状态()
{
var Inventory=context.Inventory.ToList();//获取所有记录
var ViewModel=新列表();
foreach(Inventory.Select(e=>e.ProductId).Distinct().ToList()中的int-ProductId)
{
ViewModel.Add(newmodels.ProductsInDepartments()
{
ProductId=ProductId,
ProductName=Inventory.First(e=>e.ProductId==ProductId).ProductName,
AdminTotal=Inventory.Count(e=>e.ProductId==ProductId&&e.DepartmentId==(int)Department.Admin),
ITTotal=Inventory.Count(e=>e.ProductId==ProductId&&e.DepartmentId==(int)Department.IT),
Status=Inventory.First(e=>e.ProductId==ProductId)。Status//我不确定您试图对Status做什么,因此您可能需要更改此设置
});
}
返回视图(ViewModel);
}
查看

现在的观点非常直截了当

@model List<ProductsInventory.Models.ProductsInDepartments>
<table class="table">
    <tr>
        <th>Product Name</th>
        <th>IT Department</th>
        <th>Administration</th>
        <th>Total Products</th>
    </tr>
    @foreach (var Item in Model)
    {
        <tr>
            <td>@Model.ProductName</td>
            <td>@Model.ITTotal.ToString()</td>
            <td>@Model.AdminTotal.ToString()</td>
            @if (Model.Status == 0)
            {
                <td>No Products</td>
            }
            else
            {
                <td>@Model.Status</td>
            }
        </tr>
    }
</table>
@型号列表
品名
计算机中心
管理
总产品
@foreach(模型中的var项目)
{
@Model.ProductName
@Model.ITTotal.ToString()
@Model.AdminTotal.ToString()
@如果(Model.Status==0)
{
没有产品
}
其他的
{
@模型.状态
}
}

再说一次,我不确定您试图对状态做什么,但是对于字符串重写,您可以在视图中这样做,这非常好。视图应该处理表示层关注的各个方面。

感谢您的回复。我确实这样做了,但问题是一样的。如果您获得ProductId,您必须运行调试和se。最好的方法是在ViewModel StatusModel中按productId分组,这是用于填充Productname和status的操作。我认为最好是更新从控制器发送到视图的ViewModel,使其包含已存在的状态。将模型发送到视图,然后执行其他工作似乎是不必要的。供应