如何根据客户联系人姓名对 Northwind 订单进行分组

How to group Northwind orders based on Customer ContactName

我是 C# 和 LINQ 的新手,我正在使用 Northwind 数据库。我的视图显示了数据库中的所有订单,但没有排序。我想根据联系人姓名(客户)和字母顺序显示订单:例如,AVARIA 以及该客户的所有订单。等等...

我想要这样的东西:

AVARIA

ORDER 1 OF AVARIA FROM DATABASE WITH ITS DETAILS 
ORDER 2 OF AVARIA FROM DATABASE WITH ITS DETAILS  
ORDER 3 OF AVARIA FROM DATABASE WITH ITS DETAILS  

BECUA

ORDER 1 OF BECUA FROM DATABASE WITH ITS DETAILS
ORDER 2 OF BECUA FROM DATABASE WITH ITS DETAILS  

and so on... 

因为这向我显示了所有来自数据库的订单,没有任何排序,比如第一行有一个订单的客户 X,然后是客户 Y,然后是另一个订单的客户 X,依此类推。我试过这个:

public ActionResult Index()
{
    var orders = db.Orders.Include(o => o.Customer).Include(o => o.Employee).Include(o => o.Shipper);
    var list = orders.OrderBy(x => x.Customer.ContactName);

    return View(list.ToList());
}

但它引发了以下异常:

An exception of type 'System.Data.Entity.Core.EntityCommandExecutionException' occurred in EntityFramework.SqlServer.dll but was not handled in user code

视图工作正常。

请帮忙。

您可以使用 group by 和 orderby。样本:

class Program
{

    class grpitem
    {
        public string groupCode;
        public string item;
    }

    static List<grpitem> list = new List<grpitem>()
    {
         new grpitem() {groupCode="3", item="b"},
         new grpitem() {groupCode="1", item="b"},
         new grpitem() {groupCode="3", item="c"},
         new grpitem() {groupCode="2", item="b"},
         new grpitem() {groupCode="2", item="a"},
         new grpitem() {groupCode="2", item="c"},
         new grpitem() {groupCode="1", item="a"},
         new grpitem() {groupCode="3", item="a"},
         new grpitem() {groupCode="3", item="d"}
    };

    static void Main(string[] args)
    {
        IEnumerable<grpitem> ordered = list.GroupBy(grp => grp.groupCode)
            .SelectMany(g => g.OrderBy(grp => grp.item)).OrderBy(g => g.groupCode);

        foreach(grpitem g in ordered)
            Console.WriteLine("groupCode:{0} item:{1}",g.groupCode,g.item);

        Console.ReadLine();
    }
}

输出:

groupCode:1 item:a
groupCode:1 item:b
groupCode:1 item:c
groupCode:1 item:d
groupCode:2 item:a
groupCode:2 item:b
groupCode:3 item:a
groupCode:3 item:b
groupCode:3 item:c

您可以使用 GroupBy(...)

public ActionResult Index()
{
    var orders = db.Orders.Include(o => o.Customer).Include(o => o.Employee).Include(o => o.Shipper);
    var groupedOrders = orders.GroupBy(o => Customer.Name, o => o);
    // grouped orders is IEnumerable<string, IEnumerable<Order>>
    return View(groupedOrders);
}