计算符合条件的数据库记录并显示在视图中

Counting Database records that meet criteria and displaying in view

使用 MVC5 EF6 VS2013

总的来说,我对 MVC 和 Web 开发还比较陌生,想知道查询数据库并计算总记录数中满足条件的记录数的最佳方法。在我的例子中,我想计算 活跃车辆的数量 .

我已经使用我知道的方法在 table 中显示活动和非活动记录,方法是查询车辆数据库 table 并创建 活动状态模型计数

模型、控制器和视图的相关位如下。

型号

namespace ATAS.Models
{
public class ActiveVehicles
    {
    public bool Active { get; set; }
    public int VehicleCount { get; set; }
    }
}

控制器

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());

    }

查看

<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>

我想达到的目标

在我看来,我想显示类似 13 辆活跃的 20 辆车。

实现此结果的最佳方法是什么?

编辑 - 我找到了一种实现它的方法,但我确信这不是最佳实践。

它能满足我的需求,但我确信它效率不高。有更好的解决方案吗?

新控制器

 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();

    }

新视图

 <div class="col-xs-6 col-sm-6 col-md-12 col-lg-12">
      <span class="text">Ambulance
          <span class="pull-right">@ViewBag.ActiveVehicles of @ViewBag.AllVehicles</span>
      </span>
      <div class="progress">
          <div class="progress-bar bg-color-blueDark" style="width: @ViewBag.percentActive%;"></div>
      </div>
 </div>

我会使用 OUTPUT 参数来计算提取数据的存储过程中的计数。

我对你的问题很好奇,想亲自知道结果。

我相信您可以通过交叉连接或更好的技术来实现这一点,但在生成它时我无法在 Linq 语法方面为您提供太多帮助(对此感到抱歉)。我确实为它创建了一个 SQL 查询并直接在上下文的数据库上执行它。确保返回的列与模型中的属性名称匹配。

SQL Fiddle of cross join.

执行和检索代码。

         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。