C# 如何返回LINQ结果并在视图中显示?

C# 如何返回LINQ结果并在视图中显示?,c#,asp.net-mvc,entity-framework,linq,group-by,C#,Asp.net Mvc,Entity Framework,Linq,Group By,我有一些类似的东西,但不知道如何将它们联系在一起,以便在视图模型中显示 我有一个名为QVRRepository.cs的存储库类,如下所示: using System; using System.Collections.Generic; using System.Linq; using VTracker.Contexts; using Microsoft.Extensions.Logging; namespace VTracker.Repositories { public class

我有一些类似的东西,但不知道如何将它们联系在一起,以便在视图模型中显示

我有一个名为QVRRepository.cs的存储库类,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using VTracker.Contexts;
using Microsoft.Extensions.Logging;

namespace VTracker.Repositories
{
    public class QVRRepository : IQVRRepository
    {

        // Declare variable to hold the QVRDataContext object to call using LINQ queries
        private QVRDataContext _context;
        private ILogger _logger;

        // Constructor class to call and assign data context on init
        public QVRRepository(QVRDataContext context, ILogger<QVRRepository> logger)
        {
            _context = context;
            _logger = logger;
        }

        public class VulnerabilityCount
        {
            public string Owner { get; set; }
            public List<KeyValuePair<string, int>> StatusCounts { get; set; }
        };

        public IEnumerable<VulnerabilityCount> GetCountsByStatus()
        {
            string owner;
            List<KeyValuePair<string, int>> statusCounts = new List<KeyValuePair<string, int>>();

            List<VulnerabilityCount> vulnerabilityCounts = new List<VulnerabilityCount>() { };

            var query =
                    from o in _context.QVRData
                    group o by o.RamOwnedBy into ownerGroup
                    orderby ownerGroup.Key
                    select ownerGroup;


            foreach (var group in query)
            {
                owner = group.Key;
                Console.WriteLine(owner);

                foreach (var o in group.GroupBy(o => o.AdditionalResourcesRequired))
                {

                    statusCounts.Add(new KeyValuePair<string, int>(o.Key, o.Count()));
                    Console.WriteLine($"\t{o.Key} : {o.Count()}");

                }

                vulnerabilityCounts.Add(new VulnerabilityCount()
                {
                    Owner = owner,
                    StatusCounts = statusCounts
                });
            }

            return vulnerabilityCounts;

        }
    }
}
使用QVRRepository.cs中的代码,我正在向控制台写入结果,并且我看到的结果显示如我所愿:

CBT-Platform Management-CCI
    Researching - RRO Team - App Team Is Not Product Owner : 447
    Blank : 4131
    Researching - App Team - Not Yet Scheduled : 5
    Compliant : 19
    Researching - RRO Team - No Solution Available : 11
CBT-Platform Management-EBS
    Researching - RRO Team - App Team Is Not Product Owner : 1045
    Blank : 7995
    Scheduled : 447
    Compliant : 32
    Researching - App Team - Not Yet Scheduled : 12
    Blocked : 1
    Researching - RRO Team - No Solution Available : 1
    Exception Required in Policyworks : 3
但我正在努力弄清楚如何将这些结果编译为一组对象,以便以类似的方式在视图中显示它们

在my*Index.cshtml**中,我有以下内容:

@model IEnumerable<VTracker.Repositories.QVRRepository.VulnerabilityCount>

@{
    ViewData["Title"] = "QVR";
}

<div class="flex-container">
    @foreach (var i in Model)
    {
        <div class="qvr-card">
            <div class="qvr-card-header">
                <p class="text-center">@i.Owner.Replace("CBT-", "").Replace("Platform Management", "Platform-MGMT")</p>
            </div>
            <div class="inner-container">
                   <div>
                       @foreach (var s in i.StatusCounts)
                       {
                        <div>@s.Key</div>
                        <div>@s.Value</div>
                       }
                   </div>
            </div>
        </div>
    }
</div>
@model IEnumerable
@{
ViewData[“Title”]=“QVR”;
}
@foreach(模型中的var i)
{

@i.Owner.Replace(“CBT-”,“”)。Replace(“平台管理”,“平台管理”)

@foreach(i.StatusCounts中的var s) { @s、 钥匙 @s、 价值观 } }
正如你在我下面的截图中看到的,我真的把事情搞砸了

第一个foreach将所有者值作为标题返回,但不是仅显示“所有者”的状态计数,而是显示每个“所有者”下所有“所有者”的所有计数(状态+计数):


在您的
GetCountsByStatus
方法中,您正在初始化
statusCounts
out
for
循环。因此,
vulnerabilityCounts
集合中的每个项目都对
statusCounts
有相同的引用。将其移动到
for
循环的内部:

foreach (var group in query)
{
    // there is no need to keep this outside either
    string owner = group.Key;

    // for every owner, the statusCounts gets initialized again
    List<KeyValuePair<string, int>> statusCounts = new List<KeyValuePair<string, int>>();
    Console.WriteLine(owner);

    foreach (var o in group.GroupBy(o => o.AdditionalResourcesRequired))
    {
        statusCounts.Add(new KeyValuePair<string, int>(o.Key, o.Count()));
        Console.WriteLine($"\t{o.Key} : {o.Count()}");
    }

    vulnerabilityCounts.Add(new VulnerabilityCount()
    {
        Owner = owner,
        StatusCounts = statusCounts
    });
}
foreach(查询中的var组)
{
//也没有必要把这个放在外面
字符串所有者=group.Key;
//对于每个所有者,statusCounts将再次初始化
列表状态计数=新列表();
控制台写入线(所有者);
foreach(group.GroupBy中的var o(o=>o.AdditionalResourcesRequired))
{
添加(新的KeyValuePair(o.Key,o.Count());
WriteLine($“\t{o.Key}:{o.Count()}”);
}
添加(新的VulnerabilityCount()
{
所有者=所有者,
StatusCounts=StatusCounts
});
}

可能不相关,但应在外部
foreach
中声明
statusCounts
,在
cshtml
中设置断点,并检查loop@StephenMuecke我做了一些编辑。不确定我现在上传的内容是否有任何改变。@adiga当我在Index.cshtml中将断点添加到foreach循环时,我看到它的“I.StatusCounts”有45个项目(status.key、status.value)。这就解释了为什么每个“所有者”都会显示所有所有者组的状态和计数。关于如何进行限制,使其仅显示每个所有者的status.key和status.value,您有什么想法吗?现在,您的新图像对于您的代码很有意义:)
foreach (var group in query)
{
    // there is no need to keep this outside either
    string owner = group.Key;

    // for every owner, the statusCounts gets initialized again
    List<KeyValuePair<string, int>> statusCounts = new List<KeyValuePair<string, int>>();
    Console.WriteLine(owner);

    foreach (var o in group.GroupBy(o => o.AdditionalResourcesRequired))
    {
        statusCounts.Add(new KeyValuePair<string, int>(o.Key, o.Count()));
        Console.WriteLine($"\t{o.Key} : {o.Count()}");
    }

    vulnerabilityCounts.Add(new VulnerabilityCount()
    {
        Owner = owner,
        StatusCounts = statusCounts
    });
}