我如何使用 LINQ 结果集按计数获取组并在 mvc razor 页面上使用 Viewdata 显示它
How do i use a LINQ Results set to get a group by Count and show it with Viewdata on mvc razor page
我正在尝试创建几张 bootstrap 卡片来显示某个状态下的工单数量。但是,我正在努力将结果查询中的数据获取到视图数据中。我还有其他通过类似方法(viewbags)工作的下拉列表。
该页面只是为变量显示空白,就像它不存在一样。
public void CountofType(IQueryable<Tickets> _Tickets)
{
var CountType = _Tickets
.GroupBy(T => new { T.Type })
.Select(group => new
{
Text = group.First().Type,
//Value = group.First().Type.Count()
Value = group.Count()
}
);
ViewBag.CountType = CountType;
ViewData["CountTypeOPEN"] = CountType.FirstOrDefault(T => T.Text == "OPEN" );
ViewData["CountTypeCLOSED"] = CountType.FirstOrDefault(X => X.Text == "CLOSED");
ViewData["CountTypeOTHER"] = CountType.FirstOrDefault(Y => Y.Text != "OPEN"
|| Y.Text != "CLOSED");
}`
HTML 卡片看起来像这样:
<div class="card-deck">
<div class="card text-white mb-3 bg-primary" style="max-width: 18rem; max-height: 7rem;>
<a href=@Url.Action("index", new { Statuses = "OPEN" }) class="btn btn-fix text-left">
<div>
<h1 class="card-title text-white text-center">@ViewData["CountTypeOPEN"] </h1>
<h5 class="card-title text-white text-center">Open Tickets</h5>
</div>
</a>
</div>
</div>
在大多数情况下,一切看起来都很好。但是,您在视图中访问 ViewData
成员的方式存在问题。首先,该值是一个匿名对象,您不能直接将其转储到页面中。您需要访问该对象的其中一个成员。例如,@ViewData["CountTypeOPEN"].Text
。然而,这实际上会失败,因为 ViewData
没有键入值,并且 object
没有 Text
属性。您首先需要将其转换为 dynamic
: @(ViewData["CountTypeOPEN"] as dynamic).Text
.
也就是说,根据您在这里所做的,所有这些都是不必要的。您知道 您正在访问的是什么特定类型,因此您所需要的只是计数。因此,您可以将操作代码更改为:
ViewData["CountTypeOPEN"] = CountType.FirstOrDefault(T => T.Text == "OPEN")?.Value ?? 0;
那么,在您看来,您不需要更改任何内容,因为现在 ViewData["CountTypeOPEN"]
实际上只是您的票数。
非常感谢 :),这让我走上正轨。
我更改了函数 a 以减少处理开销。但由于我是 C# 的新手,我不确定哪种方法最好。
ViewData["CountTypeOPEN"] = CountType.Count(T => T.Text == "OPEN");
或
ViewData["CountTypeCLOSED"] = CountType.FirstOrDefault(T => T.Text != "OPEN")?.Value ?? 0;
新程序:
public void CountofStatus(IQueryable<Tickets> _Tickets)
{
var CountType = _Tickets
.Select(group => new
{
Text = group.Status,
Value = group.Status.Count()
}
);
ViewData["CountTypeOPEN"] = CountType.Count(T => T.Text == "OPEN");
//ViewData["CountTypeCLOSED"] = CountType.FirstOrDefault(T => T.Text != "OPEN")?.Value ?? 0;
ViewData["CountTypeCLOSED"] = CountType.FirstOrDefault(T => T.Text != "CLOSED")?.Value ?? 0;
ViewData["CountTypeSCHEDULED"] = CountType.FirstOrDefault(Y => Y.Text == "SCHEDULED")?.Value ?? 0;
}
我正在尝试创建几张 bootstrap 卡片来显示某个状态下的工单数量。但是,我正在努力将结果查询中的数据获取到视图数据中。我还有其他通过类似方法(viewbags)工作的下拉列表。
该页面只是为变量显示空白,就像它不存在一样。
public void CountofType(IQueryable<Tickets> _Tickets)
{
var CountType = _Tickets
.GroupBy(T => new { T.Type })
.Select(group => new
{
Text = group.First().Type,
//Value = group.First().Type.Count()
Value = group.Count()
}
);
ViewBag.CountType = CountType;
ViewData["CountTypeOPEN"] = CountType.FirstOrDefault(T => T.Text == "OPEN" );
ViewData["CountTypeCLOSED"] = CountType.FirstOrDefault(X => X.Text == "CLOSED");
ViewData["CountTypeOTHER"] = CountType.FirstOrDefault(Y => Y.Text != "OPEN"
|| Y.Text != "CLOSED");
}`
HTML 卡片看起来像这样:
<div class="card-deck">
<div class="card text-white mb-3 bg-primary" style="max-width: 18rem; max-height: 7rem;>
<a href=@Url.Action("index", new { Statuses = "OPEN" }) class="btn btn-fix text-left">
<div>
<h1 class="card-title text-white text-center">@ViewData["CountTypeOPEN"] </h1>
<h5 class="card-title text-white text-center">Open Tickets</h5>
</div>
</a>
</div>
</div>
在大多数情况下,一切看起来都很好。但是,您在视图中访问 ViewData
成员的方式存在问题。首先,该值是一个匿名对象,您不能直接将其转储到页面中。您需要访问该对象的其中一个成员。例如,@ViewData["CountTypeOPEN"].Text
。然而,这实际上会失败,因为 ViewData
没有键入值,并且 object
没有 Text
属性。您首先需要将其转换为 dynamic
: @(ViewData["CountTypeOPEN"] as dynamic).Text
.
也就是说,根据您在这里所做的,所有这些都是不必要的。您知道 您正在访问的是什么特定类型,因此您所需要的只是计数。因此,您可以将操作代码更改为:
ViewData["CountTypeOPEN"] = CountType.FirstOrDefault(T => T.Text == "OPEN")?.Value ?? 0;
那么,在您看来,您不需要更改任何内容,因为现在 ViewData["CountTypeOPEN"]
实际上只是您的票数。
非常感谢 :),这让我走上正轨。
我更改了函数 a 以减少处理开销。但由于我是 C# 的新手,我不确定哪种方法最好。
ViewData["CountTypeOPEN"] = CountType.Count(T => T.Text == "OPEN");
或
ViewData["CountTypeCLOSED"] = CountType.FirstOrDefault(T => T.Text != "OPEN")?.Value ?? 0;
新程序:
public void CountofStatus(IQueryable<Tickets> _Tickets)
{
var CountType = _Tickets
.Select(group => new
{
Text = group.Status,
Value = group.Status.Count()
}
);
ViewData["CountTypeOPEN"] = CountType.Count(T => T.Text == "OPEN");
//ViewData["CountTypeCLOSED"] = CountType.FirstOrDefault(T => T.Text != "OPEN")?.Value ?? 0;
ViewData["CountTypeCLOSED"] = CountType.FirstOrDefault(T => T.Text != "CLOSED")?.Value ?? 0;
ViewData["CountTypeSCHEDULED"] = CountType.FirstOrDefault(Y => Y.Text == "SCHEDULED")?.Value ?? 0;
}