【问题标题】:Linq statement for Orders reporting订单报告的 Linq 语句
【发布时间】:2016-03-17 18:23:55
【问题描述】:

我的数据库中有订单,每个订单都有一组津贴。与订单相关的 Allowance 有一个 ChargeIndicator 来表示它是折扣 (0) 还是非折扣 (1)。

对于某个时间段,我需要该时间段内使用的折扣,以及使用每个折扣的订单总和。

我可以获取已使用折扣的列表,但无法返回订单获取汇总信息

var discounts = this.Repository.GetOrders()
            .Where(o => 
                o.AllowanceCharge.Any(ac => !ac.ChargeIndicator) &&
                o.IssueDate > DateTime.Now.AddDays(-10) &&
                o.IssueDate < DateTime.Now.AddDays(-1))
            .SelectMany(o => o.AllowanceCharge.Where(ac => !ac.ChargeIndicator))
            .Discinct()

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    为简单起见,我可能会在两次往返中执行此操作:

    var ordersWithDiscounts = this.Repository.GetOrders()
        .Where(o => 
            o.AllowanceCharge.Any(ac => !ac.ChargeIndicator) &&
            o.IssueDate > DateTime.Now.AddDays(-10) &&
            o.IssueDate < DateTime.Now.AddDays(-1));
    var sumOfOrdersWithDiscounts = ordersWithDiscounts.Sum(o => o.TotalCostOrWhatever);
    var discounts = ordersWithDiscounts
        .SelectMany(o => o.AllowanceCharge.Where(ac => !ac.ChargeIndicator))
        .ToList();
    

    【讨论】:

    • 我需要订单总额/by/折扣,而不是全部一起
    • @MStodd:如果同一订单有两个折扣,您是说您会在结果集中获得这两个折扣,并且对于每个折扣,您还会看到(相同的)总和AllowanceCharge 关联订单的成本?
    【解决方案2】:

    最简单的方法是将关系数据反规范化,然后对数据应用聚合。

       // filter the allowance applied orders
       var filtered = GetOrders().Where(x => x.AllowanceCharge.Any(t => t.ChargeIndicator));
    
       // Flat the relations data
       var denormalized =
               from order in filtered
               join allowance in filtered.SelectMany(x => x.AllowanceCharge) on order.Id equals allowance.OrderId
               select new { order = order.Name, alName = allowance.Name };
    
       // groupt it
    
       var result = denormalized.GroupBy(info => info.alName)
                   .Select(group => new
                   {
                       Allowance = group.Key,
                       OrderCount = group.Count()
                   });
    

    使用 Lambda 表达式结合士气低落和分组,

     var result =
     filtered.Join(filtered.SelectMany(x => x.AllowanceCharge), 
                   order => order.Id, allowance => allowance.OrderId,
                   (order, allowance) => new { order = order.Name, allowance = allowance.Name })
             .GroupBy(record => record.allowance)
             .Select(group => new
                {
                    Allowance = group.Key,
                    OrderCount = group.Count()
                });
    

    结果 -

    { Allowance = A, OrderCount = 3 }
    { Allowance = C, OrderCount = 1 }
    { Allowance = B, OrderCount = 1 }
    

    【讨论】:

      【解决方案3】:

      我认为这就是您想要的(如果您希望在 1 个查询中全部完成):

      this.Repository.GetOrders()
          .Where(o => o.IssueDate > DateTime.Now.AddDays(-10) &&
                      o.IssueDate < DateTime.Now.AddDays(-1))
          .SelectMany(o => o.AllowanceCharge
              .Where(ac => !ac.ChargeIndicator)
              .Select(ac => new { order = o, charge = ac}))
          .GroupBy(_ => _.charge.Id)
          .Select(grp => new
          {
              AllowanceChargeId = grp.Key,
              OrdersForThisCharge = grp.Select(_ => _.order)
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        • 2012-11-17
        • 1970-01-01
        相关资源
        最近更新 更多