我如何使用 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;

    }