【问题标题】:Using LINQ, join data from tables into single rows in multi list form view使用 LINQ,将表中的数据连接到多列表表单视图中的单行
【发布时间】:2018-01-08 14:01:32
【问题描述】:

我有一个表格,它为每个“系统类型”收集两个总数,可从下拉列表中选择(出于安全目的,我不得不混淆我的场景的细节,抱歉。)

用户可以根据需要添加任意数量的项目。每个都有一个 AM 计数和一个 PM 计数。

表格如下:

我正在使用的数据库结构如下:

架构无法更改。

我需要用 LINQ 编写的 CRUD 操作。我正在努力想出“读取”语法,只是为了将数据从表中获取到表单中。需要限制在 ID 5 及以上的 DySystems。

如果没有 AM/PM 方面,并且每个 DySystem 只有一个数量,我可以使用我编写的以下代码:

    public List<DySystemCountDto> GetDySystemCounts(int surveyId)
    {
        using (_context)
        {
            var joinData = _context.DySystemResourceCounts.Where(r => r.ResourceCount.SurveyId == surveyId)
                .Include(r => r.ResourceCount)
                .ToList();

            var existingCounts = joinData.Select(r => new DySystemCountDto
            {
                ResourceCountId = r.ResourceCountId,
                Quantity = r.ResourceCount.Quantity,
                DySystemId =  r.DySystemId
            }).ToList();

            return existingCounts;
        }
    }

要在视图中使用它:

                <tr>
                    <th>DySystem</th>
                    <th>Count</th>
                    <th></th>
                </tr>
                @{
                    for (var i = 0; i < Model.DySystemCounts.Count; i++)
                    {
                        var item = Model.DySystemCounts[i];

                        <tr>
                            <td>
                                <select class="form-control" asp-items="Model.DySystems" 
                                  asp-for="@Model.DySystemCounts[i].DySystemId"></select>

                            <td>
                                <input type="hidden" asp-for="@Model.DySystemCounts[i].ResourceCountId" />
                                <input class="form-control" asp-for="@Model.DySystemCounts[i].Quantity"/>

                            </td>
                            <td>
                                    <a href="#" class="remove">Remove</a>
                            </td>
                        </tr>
                    }
                }

但是,由于 AM/PM 混合在一起,我不知道如何处理它。

类似于.. 对于每个 DySystem 的每个 Am 计数,还选择具有相同 DySystemId 的 Pm 计数。

我正在使用 .Net Core API 项目

【问题讨论】:

    标签: c# .net entity-framework linq asp.net-core


    【解决方案1】:

    我从你的问题中得到的是,你想在

    中添加 AM/PM 计数
    var existingCounts = joinData.Select(r => new DySystemCountDto
                {
                    ResourceCountId = r.ResourceCountId,
                    Quantity = r.ResourceCount.Quantity,
                    DySystemId =  r.DySystemId
                }).ToList();
    

    所以你的existingCounts 也应该包含 AM/PM。

    var finalList = (from item in joinData 
                     group item by item.DySystemId into g
                     let TempAMCount = g.Where(x=>x.IsAM==true)
                                        .Select(c => c.ResourceCount.Quantity)
                     let FinalAMCount = g.First().AMCount = TempAMCount
                     let TempPMCount = g.Where(x=>x.IsAM==false)
                                        .Select(c => c.ResourceCount.Quantity)
                     let FinalAMCount = g.First().PMCount = TempPMCount
                     select g.First()
                    ).ToList();
    

    我无法测试它,但似乎这会有所帮助。

    【讨论】:

    • 谢谢,这看起来确实很有趣,我一定会尝试的!
    • 太好了,我非常感谢!请注意,我需要在右侧的 TempAMCount 和 TempPMCount 之后添加 .FirstOrDefault() 才能正常工作,并将最后一个 let FinalAMCount 更改为 let FinalPMCount
    • 我还必须将 AMCount 和 PMCount 添加到我的模型中 - 尝试添加到我的 DTO 并使用它,但我并没有获得同样的成功。
    • 很高兴知道这对您有用,是的,您需要将 AMCount 和 PMCount 添加到您的 DTO。Count 将映射到这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多