2017-07-26 7 views
0

Kommend von T-SQL, ich versuche, mit einem Basisdatensatz in einem Beispiel ASP.Net mvc (C#) Programm zu arbeiten.Linq - Join auf Primärschlüssel der verbundenen Tabelle

Ich habe drei Tabellen wie unten im Bild (verlinkt) gezeigt:

  1. Sammlungen (PK IdCollection)
  2. Sprint (PK IdSprint, FK IdCollection)
  3. DeployDocuments (PK IdDeployDocuments, FK IdSprint
  4. )

Table relationship diagram

In meiner asp.net Mvc cont Walze, würde Ich mag die Linq Äquivalent-Datensatz dieser einfachen Abfrage zu der Ansicht zu übergeben:

SELECT 
c.TxCollectionName 
,s.SprintNumber 
,COUNT(dd.IdDeployDocument) [NumProjects] 
FROM Collections AS c 
JOIN Sprints AS s 
    ON s.IdCollection = c.IdCollection 
LEFT JOIN DeployDocuments AS dd 
    ON dd.IdSprint = s.IdSprint 
GROUP BY 
c.TxCollectionName 
, s.SprintNumber; 

Ich kann nicht für das Leben von mir, herauszufinden, wie dies zu tun! Sobald ich versuche, eine zweite Verknüpfung in linq (geschweige denn eine linke Join) zu erstellen.

Ich war vorher nur mit:

var CollectionSprints = db.Collections.Include(d => d.Sprints) 

Aber ich brauche die Summe aller Projekte (deployDocuments) als auch, so dass nun eine Abfrage zu feilschen zusammen wie ich versuche, so:

 var query = from Collections in db.Collections 
       join Sprints in db.Sprints on Collections.IdCollection equals Sprints.IdCollection 
       join DeployDocuments in db.DeployDocuments on DeployDocuments.IdSprint equals Sprints.IdSprint 

aber sobald ich zum zweiten Join komme, wirft es Fehler ab, gibt es eine Einschränkung von linq, die ich lesen sollte? Gibt es einen völlig anderen Ansatz, den ich zur Lösung dieses Problems ergreifen sollte? Oder sollte ich nur GTFO und nehmen mehr Kurse über C#

+0

Warum können Sie nicht eine gespeicherte Prozedur für diesen Einsatz? Sind Sie entschlossen, LINQ zu verwenden? –

+0

Ich kann absolut eine gespeicherte Prozedur mit diesem verwenden, ich habe noch nicht gelernt, wie gespeicherte Prozeduren mit asp.net mvc zu verwenden, aber ich bin sicher, dass ich schnell genug lernen kann. Ist das eine "komplexe" Abfrage in linq? ** edit: ** Ich denke, meine Wahrnehmung ist ein wenig verzerrt, weil ich nicht daran gewöhnt bin, Stored Procedures für Abfragen von weniger als 10-15 Zeilen zu erstellen, ist es die beste Vorgehensweise, SPs für alles zu verwenden, was nicht ' t eine "grundlegende" Abfrage? –

+0

Mit dem 'LEFT JOIN' kann es kompliziert werden. Ich sage nicht, dass es nicht machbar ist, nur mit Ihrem Niveau, es könnte einfacher sein, mit einer gespeicherten Prozedur zu gehen. –

Antwort

1

Der Linq Link Join sieht ein bisschen anders als eine SQL Links Join, so kann es ein wenig verwirrend sein. This SO answer zeigt eine einfache Möglichkeit zum Schreiben Linq linken Verbindungen. Der .DefaultIfEmpty() macht den zweiten Join zu einem linken Join.

Hier ist, was ich kam mit:

var result = (
    from c in Collections 
    from s in Sprints.Where(s => s.IdCollection == c.IdCollection) 
    from dd in DeployDocuments.Where(dd => dd.IdSprint == s.IdSprint).DefaultIfEmpty() 
    select new { c, s, dd }) 
.GroupBy(g => new { g.c.TxCollectionName, g.s.SprintNumber }) 
.Select(s => new { s.Key.TxCollectionName, s.Key.SprintNumber, NumProjects = s.Count() }; 
+0

Danke, ich weiß es zu schätzen, dass Sie sich die Zeit genommen haben, dies zu beantworten! Es scheint zu funktionieren wie erwartet; Allerdings macht es mir klar, dass ich ein bisschen über meinen Kopf bin und wahrscheinlich einfach rückwärts gehen und ein paar mehr Kurse über C# und Datensätze im Allgemeinen machen sollte. Danke noch einmal! –

Verwandte Themen