计算符合条件的数据库记录并显示在视图中
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 查询并直接在上下文的数据库上执行它。确保返回的列与模型中的属性名称匹配。
执行和检索代码。
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。
使用 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 查询并直接在上下文的数据库上执行它。确保返回的列与模型中的属性名称匹配。
执行和检索代码。
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。