2016-06-05 13 views
0

Ich habe eine Azure-Webanwendung, die als restliche API dient. Dieses Backend definiert die Modelle, die von meinem System verwendet werden: Benutzer, Teams, Projekte, Elemente. Ein Benutzer kann vielen Teams beitreten, und das Team -> Projekt -> Item-Struktur ist ein Grandparent -> Eltern -> Child-Beziehung.Azure WebJobs und Modelle und SQL-Abfragen

Ich möchte eine tägliche E-Mail-Zusammenfassung von Updates für jeden Benutzer einrichten. Ich möchte, dass dies in einem Azure-Web-Job im Hintergrund ausgeführt wird, um den kundenorientierten API-Server nicht zu belasten.

Wenn in der API-Controller das Schreiben von Code, kann ich einfach Abfragen wie folgt schreiben, um alle Einzelteile zu erhalten, die zu einem bestimmten Team gehören (weil die Modelle und ihre hierarchischen Beziehungen in der API definiert sind):

var items = await (from x in db.Items 
        where x.Project.Team.TeamId == teamId 
        select x).ToListAsync(); 

Aber im Web-Job kann ich das nicht - es gibt keine Modelle, von denen man sprechen könnte. Ich sehe ein paar Optionen:

Option A) Irgendwie verwenden (oder erstellen) Sie die Modelle (und den DB-Kontext?) Im Web-Job. Wenn das möglich ist (und keine schreckliche Idee), denke ich, das ist was ich will.

Option B) Machen Sie Frieden mit vielen, ausführlichen SQL-Abfragen im Web-Job. Ich kann die Benutzertabelle nach den Teams abfragen, zu denen sie gehören. Dann kann ich für jedes Team die Projekttabelle nach einer Reihe von Projekten abfragen. Dann kann ich für jedes Projekt die Items-Tabelle für die Items in jedem Projekt abfragen.

Gibt es eine Möglichkeit, eine magische SQL-Abfrage zu erstellen, die effizienter funktioniert als die vielen Aufrufe von Option B an die Datenbank? Ich habe versucht, Dinge wie die folgenden, haben aber keine Arbeitsschema gefunden:

SELECT * FROM Items WHERE Projects WHERE Teams = teamId; 
+0

SQL hat '=' für gleich. – jarlh

+0

@jarlh guter Punkt - bearbeitet. Das war sicher nicht das einzige, was mit meiner erfundenen Frage falsch war :) – waffles

Antwort

0

Nun scheint es, was ich wollte, war ein JOIN: What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?

ich wirklich habe immer nur LINQ verwendet ziehen aus SQL-Datenbanken, jetzt weiß ich, wie es auf die altmodische, ausführlicher, weniger intuitive Art und Weise zu tun :)

Hier ist der Code, den ich verwende alle Elemente zu ziehen, die zu einem bestimmten Team gehören:

SqlCommand command = new SqlCommand(); 
command.CommandText = @"SELECT Items.* FROM Items 
         JOIN Projects 
          ON Projects.ProjectId = Items.ProjectId 
         JOIN Teams 
          ON Teams.TeamId = Projects.TeamId 
        WHERE Teams.TeamId = '" + teamId.ToString() + "'"; 
1

Der beste Weg aus meiner Sicht ist Opition C) - Refaktorieren Sie Ihre Lösung und erstellen Sie ein separates Projekt, das Datenkontext, Modelle und alle Migrationen enthält. Danach können Sie dieses Projekt von Ihrer Haupt-App und von WebJob aus referenzieren. Sie können auch einige zentrale datenbankbezogene Funktionen in dieses Projekt verschieben, um sie von anderen Projekten aus zugänglich zu machen.

+0

Das hört sich nach einer ziemlich vernünftigen Sache an - zu viel, um diesen Moment richtig zu ändern, aber vielleicht bald! – waffles

Verwandte Themen