5

私は持っている:

public class Order
{
    public string Customer;
    public List<OrderLine> OrderLines;
}

public class OrderLine
{
    public decimal Quantity;
    public decimal UnitPrice;
}

私の目標は、顧客注文のリストを降順で検索することです。(Amount == Quantity*UnitPrice のすべてのオーダーラインの追加)

2 人の顧客 (Customer1、Customer2) の 6 つの注文があるとします。各顧客には 3 つの orderLines があります。

私は試しています:

var result = Database.GetAllOrders().OrderByDescending(order =>  
          order.Lines.Sum(ol=>ol.Quantity*ol.UnitPrice))
         .GroupBy(order=>order.CustomerName, 
         order=>order.Lines.Sum(ol=>ol.Quantity*ol.UnitPrice),
            (customerName, amount) => new {Customer=customerName, Amount=amount});

しかし、私は次のようなものを取得します:

顧客 2:
- 金額: 78
- 金額: 89
- 金額: 12

顧客 1:
- 金額: 64
- 金額: 36
- 金額: 28

私が求めようとしている間は:

顧客 2:
- 金額 179

顧客 1:
- 金額 128

何か提案はありますか?
本当にありがとう!

4

3 に答える 3

9

注文の前にグループ化と合計を行う必要があり、顧客名 (または理想的には顧客 ID) でのみグループ化する必要があるようです。

var query = Database.GetAllOrders()
                    .GroupBy(order => order.CustomerName)
                    .Select(orders => new { 
                        Customer = orders.Key,
                        Amount = orders.Sum(o => o.OrderLines.Sum(
                                                 l => l.Quantity * l.UnitPrice))
                    })
                    .OrderByDescending(x => x.Amount);
于 2012-08-21T05:54:38.080 に答える
0

私はそれが具体的な答えではないことを知っていますが、私は似たような挑戦をしてこれをしました:

var elements = db.Orderheads
.Where(o => o.OrderDate.Value >= start && o.OrderDate.Value <= end)
.GroupBy(o => o.Employee)
.Select(g => new 
{
    Employee = g.Key,
    OrdersCount = g.Count(),
    TotalAmount = g.Sum(o => o.TotalExVat),
    TotalQuantity = g.SelectMany(o => o.Orderlines).Sum(ol => ol.QuantityOrdered)
})
.OrderByDescending(o => o.TotalAmount)
于 2015-06-04T11:10:02.273 に答える
0

ジョンの答えは正しいですが、このAmountプロパティを使用して結果を並べ替えて表示する場合は、具体的なプロパティにしないでください。

public class Order
{
    public string Customer;
    public List<OrderLine> OrderLines;
    public decimal Amount
    {
        get
        {
            if (this.OrderLines == null)
                return 0;

            return this.OrderLines.Sum(o => o.Quantity * o.UnitPrice);
        }
    }
}

あなたはまだその場でそれを計算していますが、コレクションを並べ替えるためにそれを使用していて、それを表示したい場合は、それを他の何かにも使用したいと思うでしょう - アクセスプロパティとして保持してください.

だから私たちはプロパティを持っています!


そして、実際に質問に答えるには、

var result = orders
    .GroupBy(o => o.CustomerName)
    .Select(g => new
    {
        CustomerName = g.Key,
        TotalAmount = g.Sum(o => o.Amount)
    })
    .OrderByDescending(g => g.TotalAmount));
于 2012-08-21T06:01:08.513 に答える