2016-01-08 4 views
0

Учитывая список заказов на поставку, некоторые из них частично отправлены, некоторые из них полностью отправлены, я изо всех сил пытаюсь написать запрос объекта linq to objects, который группирует заказы по месяцам и суммирует упорядоченные суммы и суммы отправлены.Linq к объектам агрегированные необязательные поля

Public Class Order 
Property OrderDate as Date 
Property Items as List(Of OrderItem) 
end Class 

Public Class OrderItem 
Property Sku as string 
Property Qty as integer 
Property Price as decimal 
Property Shipments as list(Of Shipments) 
End Class 

Public Class Shipment 
Property ShipmentDate as Date 
Property OrderItem as OrderItem 
Property ShippedQty as integer 
end class 

Dim Orders as List(Of Order)=GetOrdersFromSomewhere() 
Dim Query=Orders.SelectMany(function(x) x.Items).SelectMany(function(y) y.Shipments) 

Но запрос собирает только погруженные детали, пропуская те неотправленный

ответ

1

Группа заказов по месяцам с использованием StringFormat «YYYY-MM» для OrderDate
рассчитает заказывается отдельно и отгруженные количества

Dim orders As List(Of Order) = GetOrdersFromSomewhere() 
Dim result = orders.GroupBy(Function(o) o.OrderDate.ToString("yyyy-MM")). 
        Select(Function(grp) 
           Return New With 
           { 
            .Month = grp.Key, 
            .OrderedSum = grp.Sum(Function(o) o.Items.Sum(Function(item) item.Qty)), 
            .ShippedSum = grp.Sum(Function(o) o.Items.Sum(Function(item) item.Shipments?.Sum(Function(ship) ship.ShippedQty))) 
           } 
          End Function) 

'Print result 
For Each month In result 
    Console.WriteLine($"{month.Month}{vbTab}Ordered: {month.OrderedSum}, Shipped: {month.ShippedSum}") 
Next 
+0

Блестящее решение, благодаря Фабио –

1

Вы должны использовать GroupBy, а затем сделать Sum.

Вы можете добавить метод в класс OrderItem, Общая стоимость (?) для получения общей цены или заказов, аналогичным образом вы можете определить способ получения цены AmountShipped. Здесь я демонстрирую метод TotalPrice для получения общей цены всего заказа.

Public Class OrderItem 
    Property Sku as string 
    Property Qty as integer 
    Property Price as decimal 
    Property Shipments as list(Of Shipments) 

     Public Function TotalPrice() As Decimal 
        Return CDec(Me.Qty) * Me.Price 
       End Function 
     End Class 

Тогда для группировки заказов по дате и получить сумму, вы можете использовать следующий код

Dim orders = New GetOrdersFromSomewhere() 
Dim ordersGroupedByDate = orders.GroupBy(Function(x) x.OrderDate) 

For Each orderByDate As var In ordersGroupedByDate 
    Dim dateTimeItem = orderByDate.Key 
    Dim sumOfOrderedItems = orderByDate.SelectMany(Function(x) x.Items.[Select](Function(y) y.TotalPrice())).Sum() 
Next 
Смежные вопросы