2013-07-22 49 views
4

我有两个表Customers和Orders。我想要一个LINQ查询来获取由所有的客户组织的所有订单的列表,然后按年分组。如果有相应的客户,“没有订单”没有订单应显示。使用LINQ查询和基于两个参数的订单加入两个表

Customers表的列

customer_id 
name 
city 

Orders表的列

order_id 
order_date 
order_total 
customer_id 

我试着以下面的方式写它,但它不给出完整的输出。我纠正它吗?

+1

你能帮我理解你的意思是什么“按月组织,然后按年”。你的意思是OrderBy – CSharped

+0

是的,它应该'OrderBy' –

回答

7

我终于得到了正确的答案,其完全按预期的结果。我已经把它放在下面。我已经使用了两个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); 
        } 
       } 
      } 
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" 
      }; 
5

就像这样。你可以使用LINQ Predicates做到这一点

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