C# 如何根据客户联系人姓名对Northwind订单进行分组
我是C#和LINQ的新手,我正在使用Northwind数据库。“我的视图”显示数据库中的所有订单,而不显示订单。我想根据联系人姓名(客户)和字母顺序显示订单:例如,AVARIA和该客户的所有订单。等等 我想要这样的东西:C# 如何根据客户联系人姓名对Northwind订单进行分组,c#,linq,model-view-controller,northwind,C#,Linq,Model View Controller,Northwind,我是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 DATABAS
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());
}
但它提出了以下例外:
类型的例外
中出现“System.Data.Entity.Core.EntityCommandExecutionException”
EntityFramework.SqlServer.dll,但未在用户代码中处理
风景不错
请提供帮助。您可以使用分组依据和医嘱依据。样本:
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();
}
}
您可以使用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);
//分组顺序是IEnumerable
返回视图(groupedOrders);
}
您不知道如何将订单列表转换为客户列表。您应该在那里应用排序。@GertArnold我尝试过:var orders=db.orders.Include(o=>o.Customer.Include)(o=>o.Employee.Include(o=>o.Shipper);var list=orders.OrderBy(x=>x.Customer.ContactName);返回视图(list.ToList());但是我确信这个查询是不好的,因为我遇到了异常。所以编辑你的问题,显示你尝试了什么,以及你遇到了什么异常。你没有让这变得容易。始终显示内部异常!o=>Customer.ContactName,当我尝试访问它时,它表示访问非静态字段Customer.ContactName需要对象引用。上面的代码是否有效,但您无法从o.ContactName读取?你能从类中读取其他属性吗?你在哪里读取这个属性?不行,当我尝试访问Customer.ContactName时,它说需要一个对象引用来访问非静态字段Customer.ContactName:var groupedOrders=orders.GroupBy(o=>Customer.ContactName,o=>o);“我的模型”中有两个不同的类“订单”和“客户”。您必须显示更多的类才能获得更好的帮助。您提到模型中有2个类,但在选择订单时包含3个类。我在你的代码中遗漏了一些东西,需要查看问题才能解决它。
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
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);
}