【问题标题】:Join two tables using LINQ Query and order based two parameters使用 LINQ 查询和基于顺序的两个参数连接两个表
【发布时间】:2014-09-29 15:22:16
【问题描述】:

我有两张表 Customers 和 Orders。我想要一个 LINQ 查询来获取所有客户下的所有订单的列表,这些订单首先按月组织,然后按年组织。如果没有对应客户的订单,则显示“No Orders”。

Customers表的列是

customer_id
name
city

Orders 表的列是

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 
          };   

我该如何纠正它?

【问题讨论】:

  • 你能帮我理解“先按月组织,然后按年组织”是什么意思吗?你的意思是OrderBy
  • 是的,它应该'OrderBy'

标签: linq-to-sql join


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    类似的东西。您可以使用 LINQ 谓词来做到这一点

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

    【讨论】:

      【解决方案3】:

      这是你可以做的:

      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" 
                };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-15
        • 2011-09-03
        • 1970-01-01
        • 1970-01-01
        • 2018-07-03
        • 1970-01-01
        • 2018-03-06
        • 1970-01-01
        相关资源
        最近更新 更多