使用LINQ查询连接两个表并按照两个参数排序

9

我有两个表:Customers和Orders。我想要一个LINQ查询来获取所有客户下单的订单列表,首先按月份排序,然后按年份排序。如果没有与客户对应的订单,则显示“无订单”。

Customers表的列如下:

customer_id
name
city

订单表的列为:

order_id
order_date
order_total
customer_id

我尝试以以下方式编写,但它没有给出完整的输出。

var res = from cust in db.Customers 
          join ord in db.Orders 
               on cust.customer_id equals ord.customer_id into g 
          from d in g.DefaultIfEmpty() 
          select new { 
               name=cust.name, 
               oId=d.order_id==null?-1:d.order_id 
          };   

我该如何纠正它?

1
你能帮我理解一下“首先按月份组织,然后按年份组织”是什么意思吗?你是指OrderBy吗? - CSharped
是的,它应该使用“OrderBy”。 - Maruthi Revankar
3个回答

15

我终于得到了正确的答案,与预期完全一致。我已将它放在下面。虽然我使用了两个LINQ查询才得出结果。第一个查询给出了结果,但最终结果需要显示客户名称和订单总额,因此只是部分结果。第二个LINQ查询进一步细化了“partialResult”,并给出了预期的结果。

var partialResult = (from c in db.Customers
                      join o in db.Orders

                      on c.customer_id equals o.customer_id
                      select new
                      {c.name,
                       o.order_total,
                       o.order_date }).OrderBy(m => m.order_date.Month).ThenBy(y =>              y.order_date.Year);

var finalResult = from c in db.Customers
                       orderby c.name
                       select new
                       {
                           name = c.name,
                           list = (from r in partialResult where c.name == r.name select r.order_total).ToList()

                       };

            foreach (var item in finalResult)
            {

                Console.WriteLine(item.name);
                if (item.list.Count == 0)
                {
                    Console.WriteLine("No orders");
                }
                else
                {
                    foreach (var i in item.list)
                    {
                        Console.WriteLine(i);
                    }
                }
            }

15

像这样。您可以使用LINQ谓词来完成它

var res = Customers.Join(Orders, x => x.customer_id, y => y.customer_id, (x, y) => x).ToList();

0

以下是你可以做的:

var res = from cust in db.Customers 
          join ord in db.Orders 
               on cust.customer_id equals ord.customer_id into g 
          from d in g.DefaultIfEmpty()
          orderby d.OrderDate.Year, d.OrderDate.Month
          select new { 
               name=cust.name, 
               oId = d.order_id.ToString() ?? "No Orders" 
          };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接