Counting Database records that meet criteria and displaying in view
使用MVC5 EF6 VS2013
一般来说,我对MVC和Web开发比较陌生,我想知道查询数据库和从总记录数中计算符合条件的记录数的最佳方法。在我的例子中,我想计算活动车辆的数量。
我使用我知道的方法,通过查询车辆数据库表并创建活动状态和计数模型,在表中显示活动和非活动记录。
模型、控制器和视图中的相关位如下。
模型
1 2 3 4 5 6 7 8 | namespace ATAS.Models { public class ActiveVehicles { public bool Active { get; set; } public int VehicleCount { get; set; } } } |
控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public ActionResult Index() { IQueryable<ActiveVehicles> data = from vehicle in db.Vehicles group vehicle by vehicle.Active into active select new ActiveVehicles() { Active = active.Key, VehicleCount = active.Count() }; return View(data.ToList()); } |
视图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <table> <tr> <th> Active </th> <th> Fleet </th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Active) </td> <td> @item.VehicleCount </td> </tr> } </table> |
我想达到的目标
在我的视图中,我想显示的是20辆车中有13辆在使用。
实现这一目标的最佳方法是什么?
编辑-我找到了一个实现它的方法,但我确信这不是最佳实践。
它得到了我想要的,但我确信它不是有效的。有更好的解决方案吗?
新型控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public ActionResult Index() { int countALLVehicles = (from row in db.Vehicles select row).Count(); ViewBag.AllVehicles = countALLVehicles; int countActiveVehicles = (from row in db.Vehicles where row.Active == true select row).Count(); ViewBag.ActiveVehicles = countActiveVehicles; var percentActive = (double)countActiveVehicles / (double)countALLVehicles * 100; ViewBag.percentActive = percentActive; return View(); } |
新观点
1 2 3 | <span class="text">Ambulance <span class="pull-right">@ViewBag.ActiveVehicles of @ViewBag.AllVehicles</span> </span> |
我对你的问题很好奇,想自己知道结果。
我相信您可以通过交叉联接或更好的技术来实现这一点,但是在生成它的LINQ语法中,我不能帮您这么多忙(抱歉)。我确实为它创建了一个SQL查询,并直接在上下文的数据库上执行它。确保返回的列与模型中属性的名称匹配。
交叉联接的SQL键。
用于执行和检索的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 | query = @"SELECT COUNT([Status]) As VehicleCount, T2.Active FROM Table1 CROSS JOIN ( SELECT COUNT([Status]) As Active FROM Table1 GROUP BY [Status] HAVING [Status] = 1 ) AS T2 GROUP BY T2.Active"; ActiveVehicles data = uow.Context.Database.SqlQuery<ActiveVehicles>(query).FirstOrDefault<ActiveVehicles>(); |
希望您或在Linq中有更好知识的人可以将查询直接转换为Linq。
我将使用一个输出参数来获取数据的存储过程中的计数。