Как создать viewmodel, контроллер и представление, чтобы объединить множество таблиц в asp.net mvc Entity Framework - PullRequest
2 голосов
/ 19 июня 2019

Я хочу присоединиться и отобразить столбцы "ProductId, Количество, UnitPrice, Discount & Total" из таблиц tblOrder, tblCustomer, tblProduct, где OrderNo = GivenId.

OrderNo передается черезtextbox. Вот как это должно быть

База данных

Таблица заказов

public partial class tblOrder
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public 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; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<tblProduct> tblProducts { get; set; }
}

Таблица продуктов

public partial class tblProduct
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public tblProduct()
    {
        this.tblOrders = new HashSet<tblOrder>();
    }
    [Key]
    public int ProductId { get; set; }
    public string UnitPrice { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<tblOrder> tblOrders { get; set; }
}

Таблица клиентов

public partial class tblCustomer
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public tblCustomer()
    {
        this.tblOrders = new HashSet<tblOrder>();
    }

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

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<tblOrder> tblOrders { get; set; }
}

Это созданная мною ViewModel

public class OrderCustomerProductViewModel
{
    public OrderCustomerProductViewModel() { }
    public OrderCustomerProductViewModel(tblOrder orderow, tblCustomer customerow, tblProduct productrow)
    {
        OrderNo = orderow.OrderNo;
        CustomerName = customerow.CustomerName;
        ProductId = productrow.ProductId;
        Quantity = orderow.Quantity;
        UnitPrice = productrow.UnitPrice;
        Discount = orderow.Discount;
        Total = orderow.Total;
    }

    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; }
}

Я попытался отправить все данные для просмотра, используя список следующим образом, но были некоторые ошибки.Там написано

ICollection не содержит определения для ProductId и UnitPrice

Пожалуйста, помогите мне исправить эту ошибку.Заранее спасибо

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
              {                        
                  CustomerName = v.tblCustomer.CustomerName,
                  ProductId = v.tblProducts.ProductId,
                  Quantity = v.Quantity,
                  UnitPrice = v.tblProducts.UnitPrice,
                  Discount  = v.Discount,
                  Total = v.Total,
        })).ToList();

    return View(results);
}

!Я попробовал, как сказал [Jaggan_j], но это не сработало.[Jaggan_j] Пожалуйста, помогите мне 3

1 Ответ

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

ProductId и UnitPrice - это атрибуты одного продукта, а не набора продуктов, что вызывает ошибку. Таким образом, вы должны получить все товары в заказе, возвращая список товаров. Вы можете добавить список товара к представлению модели:

List<tblProduct> tblProductList { 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
                  {                        
                      tblProductList = v.tblProducts.ToList(),
                      --rest of your select--
                  })).ToList();

   return View(results);
}

Затем в представлении вам просто нужно перебрать tblProductList для отображения идентификатора каждого продукта и цены за единицу.

...