Как отобразить несколько моделей в рамках одного foreach в asp.net mvc? - PullRequest
0 голосов
/ 30 июня 2019

Как отобразить несколько моделей в рамках одного foreach при наличии таблицы «многие ко многим»?

Есть 3 таблицы (tblProduct, tblCustomer, tblOrder).tblOrder & tblProduct - «многие ко многим», а tblCustomer & tblOrder - «один ко многим».

Я хочу объединить эти 3 таблицы и отобразить записи, связанные с OrderNo.

Я использовал базу данных Entity Framework в первую очередь (поэтому у меня нет промежуточной таблицы для связи многих со многими). ​​

Пожалуйста, помогите мне.Я новичок в MVC.Заранее спасибо.

Вот мои столы:

Product стол:

public partial class tblProduct
{
    [Key]
    public int ProductId { get; set; }
    public string UnitPrice { get; set; }

    public virtual ICollection<tblOrder> tblOrders { get; set; }
}

Customer стол:

public partial class tblCustomer
{
    [Key]
    public int CustomerCode { get; set; }
    public string CustomerName { get; set; }

    public virtual ICollection<tblOrder> tblOrders { get; set; }
}

Order таблица:

public partial class tblOrder
{
    {
        this.tblProducts = new HashSet<tblProduct>();
    }

    [Key]
    public int OrderNo { get; set; }
    public Nullable<int> Quantity { get; set; }
    public Nullable<double> Discount { get; set; }
    public Nullable<double> Total { get; set; }
    public Nullable<double> SubTotal { get; set; }
    public Nullable<double> DiscountTotal { get; set; }
    public Nullable<double> Tax { get; set; }
    public Nullable<double> NetTotal { get; set; }
    public int CustomerCode { get; set; }

    public virtual tblCustomer tblCustomer { get; set; }
    public virtual ICollection<tblProduct> tblProducts { get; set; }
}

Просмотр модели, которую я создал:

public class OrderCustomerProductViewModel
{
    public int OrderNo { get; set; }
    public string CustomerName { get; set; }
    public int ProductId { get; set; }
    public Nullable<int> Quantity { get; set; }
    public string UnitPrice { get; set; }
    public Nullable<double> Discount { get; set; }
    public Nullable<double> Total { get; set; }
}

Я пробовал это, но я получил ошибку:

public ActionResult Index(int id)
{
    var results = (db.tblOrders.Where(l => l.OrderNo == id).Include(c => c.tblCustomer).Include(p => p.tblProducts)
          .Select(v => new OrderCustomerProductViewModel
          {
              OrderNo  = v.OrderNo,
              CustomerName= v.tblCustomer.CustomerName,
              ProductId = v.tblProducts.ProductId, <------ ERROR
              Quantity = v.Quantity,
              UnitPrice = v.tblProducts.UnitPrice,  <------ ERROR
              Discount = v.Discount,
              Total = v.Total,
          })).ToList();

    return View(results);
}

Это мой View.cshtml:

@foreach (var item in Model)
{
    <tr id="rowtest">
        <td height="100">@Html.DisplayFor(model => item.OrderNo)</td>
        <td height="100">@Html.DisplayFor(model => item.CustomerName)</td>
        <td height="100">@Html.DisplayFor(model => item.ProductId)</td>
        <td height="100">@Html.DisplayFor(model => item.Quantity)</td>
        <td height="100">@Html.DisplayFor(model => item.tblProductList.uni)</td>
        <td height="100">@Html.DisplayFor(model => item.Discount)</td>
        <td height="100">@Html.DisplayFor(model => item.Total)</td>
    </tr>
}

Я добавил это в представление:

@model IEnumerable<GridViewFuction.Models.ViewModel.OrderCustomerProductViewModel>

Ошибка: ICollection не содержит определения для ProductId и UnitPrice

Это будетбольшая помощь, если вы можете мне помочь.

1 Ответ

1 голос
/ 30 июня 2019

Способ доступа к данным - проблема. строка ниже

 ProductId = v.tblProducts.ProductId

У вас есть int на одной стороне и List<int> на другой стороне, так что это в UnitPrice

Я не знаю, как вы хотите отобразить модель, но я дам несколько вариантов

С вашей моделью также используйте

ProductId = v.tblProducts.First().ProductId

Изменение вашей модели на это

public class OrderCustomerProductViewModel
{
    public int OrderNo { get; set; }
    public string CustomerName { get; set; }
    public List<int> ProductId { get; set; }
    public Nullable<int> Quantity { get; set; }
    public List<int> UnitPrice { get; set; }
    public Nullable<double> Discount { get; set; }
    public Nullable<double> Total { get; set; }
}

Затем используйте

ProductId = v.tblProducts.Select(m => m.ProductId).ToList()

Итак, ваш результат теперь выглядит так:

var results = (tblOrders.Where(l => l.OrderNo == id)
            .Select(v => new OrderCustomerProductViewModel
            {
                OrderNo = v.OrderNo,
                CustomerName = v.tblCustomer.CustomerName,
                ProductId = v.tblProducts.Select(m => m.ProductId).ToList(),
                Quantity = v.Quantity,
                UnitPrice = v.tblProducts.Select(m => m.UnitPrice).ToList(),
                Discount = v.Discount,
                Total = v.Total,
            })).ToList();

То, что у меня есть выше, отображает одного клиента и продукты клиентов, но если вы хотите отобразить отдельного клиента с отдельными продуктами и ценами, вам нужно

  1. Предполагая, что у каждого Order есть UnitPrice и Product, сначала получите счетчик продуктов и прокрутите его при создании модели.

EDIT:

//first create a list of your view model
var resultList = new List<OrderCustomerProductViewModel>();
var results = tblOrders.Where(l => l.OrderNo == id).ToList();
//the above code can be var results = tblOrder.toList(); if you need all orders
//now loop through the results above
foreach (var order in results)
{
    var products = order.tblProducts;
    foreach (var product in products)
    {
        resultList.Add(new OrderCustomerProductViewModel
        {
            OrderNo = order.OrderNo,
            CustomerName = order.tblCustomer.CustomerName,
            ProductId = product.ProductId,
            Quantity = order.Quantity,
            UnitPrice = product.UnitPrice,
            Discount = order.Discount,
            Total = order.Total,
        });
    }    
}
//then use the resultList
//NOTE that I went with the above assumption
  1. У некоторых Orders нет Product и или UnitPrice, получите тот, который имеет наибольшее число среди Product и UnitPrice и используйте счет для цикла.

Я не могу записать весь код здесь.

...