Как сгруппировать данные таблицы с помощью страницы foreach l oop in. NET Core Razor? - PullRequest
1 голос
/ 06 мая 2020

Я следую за книгой C# 8.0 и NET Core 3.0 - Современная кроссплатформенная разработка

Сейчас я прохожу в главе 15 с упражнением 15.2 где нам поручено создать страницу Razor, на которой будет отображаться список клиентов, сгруппированных по странам. Когда вы щелкаете имя клиента, вы попадаете на новую страницу, на которой показаны полные контактные данные этого клиента и список его заказов.

Делая маленькие шаги, я создал страницу с карточкой, в заголовке будет указана страна, а затем будет указано имя каждого клиента на карте. Однако мой foreach l oop выплевывает каждый столбец данных в Customer.Country. Итак, если есть 11 стран с Германией, это делает 11 карточек с Германией в качестве названия ( см. Изображение ).

Он также заполняет имена всех клиентов по каждой стране.

Я обнаружил, что могу использовать GroupBy (), но, как я объясню ниже, это вызывает недопустимое исключение приведения типов.

customers.cs html

@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@using NorthwindEntitiesLib
@model NorthwindWeb.Pages.CustomersModel
<div class="row">
    <h1 class="display2">Customers</h1>
</div>
<div class="row">
    @foreach (Customer customer in Model.Customers)
    {
        <div class="card border-info mb-3" style="max-width: 18rem">
            <div class="card-header text-white bg-info">
                @customer.Country
            </div>
            <ul class="list-group list-group-flush">
                @foreach (var name in Model.Customers)
                {
                    <li class="list-group-item">@name.ContactName</li>
                }
            </ul>
        </div>
    }
</div>

customers.cs html .cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using NorthwindContextLib;
using NorthwindEntitiesLib;

namespace NorthwindWeb.Pages
{
    public class CustomersModel : PageModel
    {
        private Northwind db;

        public CustomersModel(Northwind injectedContext)
        {
            db = injectedContext;
        }

        public IEnumerable<Customer> Customers { get; set; }


        public void OnGet()
        {
            Customers = db.Customers
                .ToArray();

        }
    }
}

NorthwindEntitesLib

namespace NorthwindEntitiesLib
{
  public class Customer
  {
    public string CustomerID { get; set; }

    public string CompanyName { get; set; }

    public string ContactName { get; set; }

    public string ContactTitle { get; set; }

    public string Address { get; set; }

    public string City { get; set; }

    public string Region { get; set; }

    public string PostalCode { get; set; }

    public string Country { get; set; }

    public string Phone { get; set; }

    public string Fax { get; set; }

    public ICollection<Order> Orders { get; set; }
  }
}

Я попытался использовать GroupBy для группировки стран, а затем заполнить список, но это дает ошибку из-за недопустимого преобразования строки типа.

@foreach (Customer customer in Model.Customers.GroupBy(c =>c.Country))
    {
        <div class="card border-info mb-3" style="max-width: 18rem">
            <div class="card-header text-white bg-info">
                @customer.Country
            </div>
            <ul class="list-group list-group-flush">
                @foreach (var name in Model.Customers)
                {
                    <li class="list-group-item">@name.ContactName</li>
                }
            </ul>
        </div>
    }

InvalidCastException: невозможно привести объект типа 'System.Linq.Grouping`2 [System.String, NorthwindEntitiesLib.Customer]' к типу 'NorthwindEntitiesLib.Customer'.

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

Хорошо, поэтому GroupBy дает вам свойство Key. Это то, что вы будете использовать для названия страны.

Таким образом, вы будете использовать следующее (предупреждение не проверено)

@foreach (var country in Model.Customers.GroupBy(c =>c.Country))
    {
        <div class="card border-info mb-3" style="max-width: 18rem">
            <div class="card-header text-white bg-info">
                @country.Key
            </div>
            <ul class="list-group list-group-flush">
                @foreach (var customer in country.ToArray())
                {
                    <li class="list-group-item">@customer.ContactName</li>
                }
            </ul>
        </div>
    }
0 голосов
/ 06 мая 2020

GroupBy - это команда System.Linq. Вы не можете просто использовать его в случайных местах, не упомянув System.Linq.

...