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

时间:2015-03-21 04:07:09

标签: c# asp.net-mvc linq asp.net-mvc-5.2

使用MVC5 EF6 VS2013

我对MVC和Web开发相对较新,我想知道查询数据库的最佳方法,并计算满足记录总数的标准的记录数。就我而言,我想计算活跃车辆的数量

我使用我所知的方法通过查询车辆的数据库表并创建活动状态计数的模型,在表格中显示活动和非活动记录

模型,控制器和视图中的相关位在下面。

模型

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>

我想要实现的目标

在我的观点中,我希望显示类似 20 车辆 13 的内容。

实现这一结果的最佳方式是什么?

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

它让我得到了我想要的但我确信它效率不高。有更好的解决方案吗?

新控制器

 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>

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我对你的问题感到好奇,并希望自己知道结果。

我相信你可以通过交叉连接或更好的技术实现这一目标,但我无法在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。