gpt4 book ai didi

c# - 使用模型和 View (MVC)

转载 作者:太空宇宙 更新时间:2023-11-03 20:01:35 26 4
gpt4 key购买 nike

我有一个使用 C# 和 MVC5 的应用程序,带有 RazorEngine。

我的应用程序管理请求(来自客户的订单),我需要在表格中显示它们。为了实现这一点,我有一个 Controller (HistoryController)、一个 View (Index) 和一个模型 (MaterialRequestModel),它们在构造函数中采用多个参数:

 public MaterialRequestModel(MaterialRequest order, Employee aConcernedEmployee, Employee anOrderedbyEmployee, Office anOffice)

在我的 Controller HistoryController 中,我有以下索引方法,它可以完成或取消所有请求:

public ActionResult Index()
{
IQueryable<MaterialRequest> query = DB.MaterialRequest
.Where(m => m.MaterialStatusId == MatStatus.A9Cancelled || m.MaterialStatusId == MatStatus.A8Complete);

List<MaterialRequestModel> model= new List<MaterialRequestModel>();

foreach (MaterialRequest req in query)
{
model.Add(new MaterialRequestModel(req, DB.Employees.Find(req.ConcernedEmployeeId), DB.Employees.Find(req.OrderedByEmployeeId), DB.Offices.Find(req.OfficeId)));
}

return View(model);
}

现在,我可以简单地将 query 传递给 View ,但这不是一个好的做法,社区(这个!)强烈建议我使用模型来避免将逻辑放入 View 中.

但是,我忍不住认为我构建模型 的方式非常糟糕,因为我正在迭代大量结果。

我怎样才能改进这段代码,让它在没有循环的情况下变得体面?

此外,我应该将所有内容作为参数传递给我的模型,还是应该将 DB 对象传递给模型构造函数并让它在那里执行查询?

最佳答案

        IQueryable<MaterialRequest> query= DB.MaterialRequest
.Where(m => m.MaterialStatusId == MatStatus.A9Cancelled || m.MaterialStatusId == MatStatus.A8Complete)
.Select(m => new MaterialRequestModel(m, DB.Employees.Find(m.ConcernedEmployeeId), DB.Employees.Find(m.OrderedByEmployeeId), DB.Offices.Find(m.OfficeId))
.ToList();

如果您只是不想看到循环,可以使用select 语句。如果这是 EF,您将获得不在循环中查询数据库的额外好处,因为它将将该 select 语句转换为 sql。

另外,如果你想更上一层楼,你可以使用外键引用来代替所有的DB.Employees.Find(...) Here's the result of my googling for that

关于c# - 使用模型和 View (MVC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27569764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com