2016-11-18 1 views
1

Ich bin immer noch ziemlich grün auf Linq, wenn es um Projektion und Gruppierung geht. Wie kann ich die Ergebnisse der folgenden SQL-Abfrage mit linq erhalten? Oder gibt es einen besseren Ansatz zum Abrufen dieser Abfrage neben linq? Ich benutze Entity Framework und ich weiß, ich kann nur hart die SQL-Code, aber würde es vorziehen, das nicht zu tun, wenn es einen besseren Weg gibt.Wie summiere ich eine Spalte in einer untergeordneten Tabelle einer projizierten Linq-Abfrage?

SELECT j.JobId, j.Name, j.OrderId, j.ShipDate, 
    st.ShipTypeId, sum(p.DeliveryCnt * p.Quantity) AS 'DeliveryCnt' 
FROM Jobs j 
JOIN ShipTo st ON j.JobId = st.JobId 
JOIN DesignSets ds ON j.JobId = ds.JobId 
JOIN DesignSetAreas dsa ON ds.DesignSetId = dsa.DesignSetId 
JOIN Products p ON dsa.DesignSetAreaId = p.DesignSetAreaId 
WHERE j.ShipDate >= '11/13/2016' AND j.ShipDate <= '11/26/2016' 
GROUP BY j.JobId, j.Name, j.OrderId, j.ShipDate, st.ShipTypeId 

Der Code unten ist, was ich bisher habe, aber ich bin mir nicht sicher, wo oder wie ich würde die Gruppierung tun, oder, wenn dies überhaupt möglich.

var shipList = from j in db.Jobs 
        join st in db.ShipTo on j.JobId equals st.JobId 
        join ds in db.DesignSets on j.JobId equals ds.JobId 
        join p in db.Products on ds.DesignSetId equals p.DesignSetId 
        where j.ShipDate >= startDate && j.ShipDate <= endDate 
        select new ShipScheduleViewModel 
        { 
         JobId = j.JobId, 
         Name = j.OrderId + " " + j.Name, 
         ShipDay = ((DateTime)j.ShipDate).Day, 
         ShipVia = st.ShipTypeId, 
         Count = p.DeliveryCnt * p.Quantity 
        }; 
+0

Zunächst empfehle ich, dass Sie die Verwendung von Navigationseigenschaften umfassen über https://coding.abel.nu/2012/06/dont-use-linqs-join-navigate/ verbindet – juharr

+0

Sie über die Navigation recht Eigenschaften. Sie sind eine viel sauberere Art zu programmieren. Danke für diesen Link, um mich daran zu erinnern, dass es einen besseren Weg gibt. – Kyle

Antwort

1

Grundsätzlich ist die group by Syntax erfordert, dass Sie sagen, was Sie in der Gruppierung werden soll (in diesem Fall die pProducts sind, was Sie in der select kumulieren) und die Werte möchten Sie Gruppe (in diesem Fall die jJob und st.ShipTypeId) und schließlich ordnen Sie die Gruppierung in eine Variable, die Sie in Ihrem select verwenden können.

var shipList = from j in db.Jobs 
       join st in db.ShipTo on j.JobId equals st.JobId 
       join ds in db.DesignSets on j.JobId equals ds.JobId 
       join p in db.Products on ds.DesignSetId equals p.DesignSetId 
       where j.ShipDate >= startDate && j.ShipDate <= endDate 
       group p by new { j, st.ShipTypeId } into grp 
       select new ShipScheduleViewModel 
       { 
        JobId = grp.Key.j.JobId, 
        Name = grp.Key.j.OrderId + " " + grp.Key.j.Name, 
        ShipDay = ((DateTime)grp.Key.j.ShipDate).Day, 
        ShipVia = grp.Key.ShipTypeId, 
        Count = grp.Sum(p => p.DeliveryCnt * p.Quantity) 
       }; 
+0

Danke, das war eine sehr schnelle Antwort. Es war genau das, was ich brauchte. – Kyle

+0

Sie erwähnten Navigationseigenschaften in Ihrem Kommentar zu meiner Frage. Wie würde ich mit Navigationseigenschaften dieselben Ergebnisse erzielen? Insbesondere das Abrufen der Eigenschaft 'Count'. Müsste ich noch eine Gruppe machen? Kannst du mir ein Beispiel zeigen? – Kyle

+0

Mit den Navigationseigenschaften können Sie nicht festlegen, wie Tabellen verknüpft werden, da EF dies bereits weiß. Es hätte keine Auswirkung auf "Count", da dies eine Aggregationsfunktion und keine Navigationseigenschaft ist. – juharr

Verwandte Themen