2017-01-29 11 views
0

Ich schreibe ein Fakturierungssystem in VB.NET und ASP.NET mit Entity Framework, um meine Objekte zu speichern. Ich möchte alle abrechenbaren Werbebuchungen für einen bestimmten Monat zusammenfassen und in einer Rechnung zusammenfassen. Die folgende SQL-Abfrage erreicht dies, aber ich kann es nicht in Entity Framework erhalten funktionierenden Code-first:Ausführen einer GROUP BY-Abfrage in Entity Framework von einer SQL GROUP BY-Anweisung

SQL-Abfrage:

SELECT DISTINCT 
    [database].[dbo].[WorkOrderDetails].PriceCodeID, 
    [database].[dbo].[WorkOrderDetails].[Description], 
    SUM([database].[dbo].[WorkOrderDetails].[Quantity]) AS [Quantity], 
    SUM([Subtotal]) AS Subtotal, 
    SUM([Total]) AS Total 
FROM 
    [database].[dbo].[WorkOrderDetails] 
INNER JOIN 
    [database].[dbo].[WorkOrders] ON [database].[dbo].[WorkOrderDetails].[WorkOrderID] = [database].[dbo].[WorkOrders].[WorkOrderID] 
WHERE 
    [ClientID] = 182 
    AND [WorkOrders].[Date] >= '10/1/2016' 
    AND [WorkOrders].[Date] < '10/31/2016' 
GROUP BY 
    [PriceCodeID], [Description] 

Die Ausgabe dieser Abfrage ist ähnlich der folgenden:

PriceCodeID | Description | Quantity | Subtotal | Total 
------------+-------------+----------+----------+-------- 
26   BOX REFILE  19   47.50 47.50 
28   BOX RETRIEVAL  15   37.50 37.50 
98   Del/Pu Out  376  545.20 545.20 
95   Shredding  16893  760.19 760.19 

Meine Objekte sind:

  • WorkOrder: WorkOrderID, Dat e, clientId (Fremdschlüssel), List (von WorkOrderDetail)

  • WorkOrderDetail: WorkOrderDetailID, PriceCodeID (Fremdschlüssel), Beschreibung, Einzelpreis, Menge, Teilsumme, Steuer, Total, WorkOrderID (Fremdschlüssel)

  • PriceCode: PriceCodeID, Shortcode, Beschreibung, Einzelpreis, Steuer

ich versuche th zu verwenden Die Aussage unten, aber ich bin mir nicht sicher, wie man die GroupBy Aussage verwendet.

newInvoice.Details = _db.WorkOrderDetails 
         .Include("WorkOrder") 
         .Where(Function(wod) wod.WorkOrder.Date >= newInvoice.StartDate And 
              wod.WorkOrder.Date < newInvoice.EndDate And 
              wod.WorkOrder.ClientID = newInvoice.ClientID) 
         .GroupBy(...) 
         .ToList() 

Antwort

1

Sie können die aggregierten Ergebnisse durch

Dim aggregate = From wod in _db.WorkOrderDetails 
       Where wod.WorkOrder.Date >= newInvoice.StartDate And 
         wod.WorkOrder.Date < newInvoice.EndDate And 
         wod.WorkOrder.ClientID = newInvoice.ClientID) 
       Group wod By Key = New With { Key wod.PriceCodeID, Key Description } 
       Into Group 
       Select agg = Key.PriceCodeID, 
          Key.Description, 
          Quantity = Group.Sum(Function(wod) wod.Quantity), 
          Subtotal = Group.Sum(Function(wod) wod.Subtotal), 
          Total = Group.Sum(Function(wod) wod.Total) 

können Sie nicht direkt neue WorkOrderDetail in dieser Abfrage erstellen, da EF keine neuen Entity-Typen in einer LINQ-Abfrage erstellen lässt. Aber Sie können aggregate.AsEnumerable() verwenden, um fortzufahren:

newInvoice.Details = aggregate.AsEnumerable() 
        .Select(Function (wod) New WorkOrderDetail ...)