繁体   English   中英

ASP.Net MVC并使用Linq进行实体

[英]ASP.Net MVC and using Linq to Entities

我正在关注MVC 5教程: http : //www.c-sharpcorner.com/article/dashboard-application-with-asp-net-mvc-5-and-jquery/

但作者遗漏了其中一项功能-中间面板-“订单”(所有客户的订单)。 它具有“查看详细信息”链接,但没有代码,单击时会显示部分视图。

在此处输入图片说明

因此,我尝试创建该局部视图,但是在编写Linq To Entities时遇到了麻烦。

我只是想像一个标题/多个细节的局部视图:

CustomerName CustomerImage OrderDate数量ProductType,ProductName,ProductImage OrderDate数量ProductType,ProductName,ProductImage CustomerName CustomerImage CustomerDorderDate数量ProductType,ProductName,ProductImage

这是我创建的代表上述内容的ViewModel:

public class OrderDetailsViewModel
{
    public int Quantity { get; set; }
    public string ProductType { get; set; }
    public string ProductName { get; set; }
    public string ProductImage { get; set; }
}

public class CustomerOrdersViewModel
{
    public string CustomerName { get; set; }
    public string CustomerImage { get; set; }
    public DateTime OrderDate { get; set; }

    public ICollection<OrderDetailsViewModel> OrderDetailsViewModel{ get;
    set; }
}

这是DbContext和作者创建的模型:

DbContext:

public class DashboardContext : DbContext
{
    // Constructor - inherits the base constructor.
    public DashboardContext() : base("DashboardOrder")
    {
    }

    public IDbSet<Customer> CustomerSet { get; set; }
    public IDbSet<Order> OrderSet { get; set; }
    public IDbSet<Product> ProductSet { get; set; }
    public IDbSet<OrderDetails> OrderDetailSet { get; set; }
}

顾客:

public class Customer : IEntity
{
    public Customer()
    {
        Orders = new List<Order>();
    }

    public int ID { get; set; }
    public string CustomerName { get; set; }
    public string CustomerEmail { get; set; }
    public string CustomerPhone { get; set; }
    public string CustomerCountry { get; set; }
    public string CustomerImage { get; set; }

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

IEntity:

public interface IEntity
{
    int ID { get; set; }
}

订购:

public class Order : IEntity
{
    public Order()
    {
        OrderDetail = new List<OrderDetails>();
    }

    public int ID { get; set; }
    public DateTime OrderDate { get; set; }
    public virtual Customer Customer { get; set; }

    public virtual ICollection<OrderDetails> OrderDetail { get; set; }
}

订单详细信息:

public class OrderDetails : IEntity
{
    public int ID { get; set; }
    public int Quatity { get; set; }
    public virtual Order Order { get; set; }
    public virtual Product Product { get; set; }
}

产品:

public class Product : IEntity
{
    public Product()
    {
        OrderDetails = new List<OrderDetails>();
    }

    // Auto-implemented properties.
    public int ID { get; set; }
    public string ProductName { get; set; }
    public decimal UnitPrice { get; set; }
    public int UnitsInStock { get; set; }
    public string ProductImage { get; set; }
    public string ProductType { get; set; }

    public virtual ICollection<OrderDetails> OrderDetails { get; set; }
}

这是我尝试编写的DashboardController中的操作方法。

我相信我想阅读依次引用客户和订单列表的订单模型,订单列表又引用引用产品的OrderDetail列表。

但是我很难使用“ Linq to SQL”来获取模型列表中的数据,以创建我的ViewModel来展平它并以列表形式传递到我的局部视图。

    public ActionResult GetCustomerOrdersDetails()
    {
        List<CustomerOrdersViewModel> customerOrders = null;

        using (DashboardContext _context = new DashboardContext())
        {
            // Using LINQ TO SQL and deferred execution via the "ToList".
            customerOrders = (from o in _context.OrderSet
                              select new CustomerOrdersViewModel
                              {
                                  CustomerName = o.Customer.CustomerName,
                                  CustomerImage = o.Customer.CustomerImage,
                                  OrderDate = o.OrderDate,
                                  -- Here I need to process the list of Orders which in turn has a reference to the list of OrderDetail which has
                                  reference to the Product.
                                  ProductType = ?,
                                  ProductName = ?,
                                  ProductImage = ?,
                                  Quantity = ?,
                              }).ToList();
        }

        return PartialView("~/Views/Dashboard/GetCustomerOrdersDetails.cshtml", customerOrders);
    }

您首先需要一个.GroupBy()子句,以将记录按CustomerNameCustomerImageOrderDate分组。 然后,由于OrderDetail是一个集合属性,因此在将结果投影到OrderDetailsViewModel模型之前,需要一个.SelectMany()来展平该集合。

List<CustomerOrdersViewModel> model = db.OrderSet
    .GroupBy(x => new { Name = x.Customer.CustomerName, Image = x.Customer.CustomerImage, Date = x.Date })
    .Select(x => new CustomerOrdersViewModel
    {
        CustomerName = x.Key.Name, 
        CustomerImage = x.Key.Image,
        OrderDate = x.Key.Date,
        OrderDetailsViewModel = x.SelectMany(y => y.OrderDetail).Select(y => new OrderDetailsViewModel
        {
            ProductName = y.Product.ProductName,
            Quantity = y.Quantity,
            ProductType = y.Product.ProductType,
            ProductImage = y.Product.ProductImage
        }).ToList()
    }).ToList();
return PartialView(model);

然后,在视图中,您可以使用嵌套循环显示每个订单的详细信息

@model IEnumerable<CustomerOrdersViewModel>
....
@foreach(var order in Model)
{
    .... // display details of customer name, date etc
    @order.CustomerName
    foreach(var item in order.OrderDetailsViewModel)
    {
        .... // display details of product, quantity etc for each order
        @item.ProductName

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM